longhugo hat folgendes geschrieben: |
Hallo,
ich habe da eine C++ DLL und hab auch den Header. Eingebunden ist sie und es läuft auch alles, bis auf
eine function:
var GetData: function: PChar cdecl {$IFDEF WIN32} stdcall {$ENDIF};
(ist übrigens aus der C++ Header Datei mittels HeadConv 4.2 erstellt)
Also unter C++ ist GetData folgendermaßen deklariert: char **GetData(void);
Also ein Zeiger, der auf einen Array zeigt, der wiederum jeweils Zeiger auf die Daten
enthält (Nullterminiert).
Wenn ich jetzt mittels:
var rc = PChar;
und
rc = GetData;
zugreife bekomme ich nur Datenmüll (Ist ja klar - ich lese ja praktisch die Adresse
des Pointers aus).
Könnt Ihr mir helfen - ich hab irgendwie n Brett vorm Kopp ;o)
Ciao und Danke schonmal voraus |
Wie kommst du denn an die Größe des Arrays?
Die Definition des Rückgabe-Typs ist nicht richtig, du kriegst schliesslich einen Pointer auf ein array von PChars zurück und keinen PChar. Ich würde es so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TArrPChar = array [0..0] of PChar; PArrPChar = ^TArrPChar;
function GetData: PArrPChar; cdecl; {$IFDEF WIN32} stdcall; {$ENDIF}
...
var data: PArrPChar; begin data := GetData(); ... end; |
Dann kannst du auf die einzelnen Strings mit
data[0],
data[1] usw. zugreifen. Range Checking in den Compiler-Optionen muss dabei ausgeschaltet sein, sonst wird zur Laufzeit eine Exception geworfen wenn du auf
data[1]zugreifst, weil das Array nur als 0..0 deklariert ist. Wenn die Funktion ein Array mit fester Größe zurückgibt, kannst du es natürlich auch gleich so definieren.
Stefan