Gut, nun verwende ich kein Array of PChar mehr, sondern eine verkettete Liste. Das funktioniert auch ganz gut.
Ich skizziere einmal den Ablauf des Programmes:
Die Verkettete Liste sieht wie folgt aus:
Delphi-Quellcode:
type
PItemList = ^TItemList;
PPItemList = ^PItemList;
TItemList = record
Next: PItemList;
Text: PChar;
end;
Es wird die Prozedur testproc der
DLL aufgerufen. Diese sieht wie folgt aus:
Delphi-Quellcode:
procedure testproc(Text: PChar; res: PPItemList); stdcall;
var
actItem: PItemList;
begin
actItem:=res^;
if not Assigned(actItem) then begin
GetMem(res^,sizeof(TItemList));
actItem:=res^;
actItem^.Next:=nil;
GetMem(actItem^.Text,StrLen(Text)+1);
StrLCopy(actItem^.Text,Text,StrLen(Text)+1);
end;
end;
Im aufrufenden Programm sieht die Prozedur folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
resItems,actItem: PItemList;
testproc: procedure (Text: PChar; res: PPItemList); stdcall;
hdll: Cardinal;
begin
hdll:=LoadLibrary('test.dll');
@testproc:=GetProcAddress(hdll,'testproc');
resItems:=nil;
testproc('Testtext',@resItems);
if Assigned(resItems) then begin
actItem:=resItems;
while Assigned(actItem) do begin
ShowMessage(actItem^.Text);
actItem:=actItem^.Next;
//FreeMem(resItems,sizeof(TItemList));
//resItems:=actItem;
end;
end;
@testproc:=nil;
FreeLibrary(hdll);
end;
Wenn ich die beiden auskommentierten Zeilen Quelltext wieder aktiviere, dann bekomme ich beim beenden des Programmes eine
Access Violation. Wenn sie auskommentiert sind, dann läuft alles wie es soll. Aber dann bleibt doch der von mir manuell reservierte Speicher reserviert...
mfG, Christian