Autor Beitrag
longhugo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35


Dephi 7, WinXP, C++
BeitragVerfasst: Di 02.08.05 18:34 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Di 02.08.05 19:25 
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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35


Dephi 7, WinXP, C++
BeitragVerfasst: Di 02.08.05 19:31 
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