Entwickler-Ecke

Sonstiges (Delphi) - C++ DLL / Pointer auf Pointer-Array


longhugo - Di 02.08.05 18:34
Titel: C++ DLL / Pointer auf Pointer-Array
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


Stefan.Buchholtz - Di 02.08.05 19:25
Titel: Re: C++ DLL / Pointer auf Pointer-Array
user profile iconlonghugo 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..0of 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


longhugo - Di 02.08.05 19:31
Titel: Re: C++ DLL / Pointer auf Pointer-Array
Hallo Stefan,

ja, ich denke ich hab mich zu sehr auf den Header Converter verlassen. Werde gleich mal Deine
Lösung ausprobieren...

Danke für das schnelle Posting - super

LH