Ich habe eine VB-Anwendung beantragen eine Liste von Benutzern aus einem C-DLL:
VB fragt die DLL, wie viele Benutzer es gibt, und initialisieren Sie dann ein Array auf die entsprechende Größe.
VB wird dann sein Array durch Verweis auf eine DLL-Funktion übergeben, die es mit Benutzernamen füllen wird.Wie viele Sternchen sollte ich verwenden, wenn ich einen Zeiger auf ein Array von C-Strings deklariere?
Ich begann mit dem Schreiben der C-Funktion wie folgt: foo(char **bar);
, die als ein Array von Strings behandelt werden würde. Aber dann wurde mir klar, dass ich jedes Element im Array auf eine andere C-Zeichenfolge (die char *username
in der verknüpften Liste struct userlist
) setzen werde, anstatt die Daten zu ändern, auf die bereits hingewiesen wurde. Das Array von Arrays wird nach Wert übergeben: eine Kopie einer Liste von Adressen, so dass die Adressen auf die ursprünglichen Daten zeigen, aber das Ändern der Adressen in dieser Kopie wird die Liste der Adressen des Aufrufers nicht ändern (denke ich jedenfalls)). Also, sollte ich es foo(char ***bar);
deklarieren? Dies wäre ein Zeiger auf das Array von Zeichenfolgen, so dass, wenn ich die Zeichenfolgen ändere, auf die das Array zeigt, wird es das Array von Zeichenfolgen ändern, die der Aufrufer (VB) benutzt .... richtig?
Diese meine Nutzung ist bisher (habe es nicht getestet noch ... Ich bin Codierung gerade noch die DLL als der noch, es gibt keine VB-Front-End nennen es so weit)
EXPORT void __stdcall update_userlist(char ***ulist){
int i = 0;
userlist *cur_user = userlist_head; //pointer to first item in linked list
for(; i < usercount_; ++i){
*ulist[i] = cur_user->username;
cur_user = cur_user->next;
}
}
gut, wenn ich die VB SAFEARRAY durch Verweis auf eine C-Funktion übergeben, die einen Zeiger erwartet, kann ich es so manipulieren, richtig? Und wenn ich sicherstelle, dass das VB-Array die richtige Anzahl von Elementen enthält, indem ich vorher die DLL nach dieser Nummer frage, dann kann ich einfach durch das Array iterieren und die Elemente ändern, oder? Wenn das, was Sie über ein VB-Array von Longs gesagt haben, einfach funktioniert, dann funktioniert auch ein Array von Strings, da BSTR wirklich nur char * ist. Ich denke, die Verwendung der regulären gefährlichen Array und zwei Anrufe ist besser für die Einfachheit dieses Programms geeignet, anstatt eine SAFEARRAY ... –
... Mein Hauptproblem ist, dass ich die Zeichenfolgen in der VB-Array ändern kann, wenn Ich übergebe es an ein Char **, aber würde das nicht das tatsächliche Array nach Wert übergeben und nur die Strings durch Referenz? Dies würde es unmöglich machen, das Array so umzulenken, dass es auf verschiedene Strings zeigt, da ich nur die Kopie des Arrays ändern würde und nicht die Daten, auf die das Original und die Kopie zeigen. –
nein, du hast Recht, es kann keine Strings übergeben, nur ganzzahlige Typen ...Danke –