Es gibt ja
API-Funktionen, denen man eine Struktur übergibt, welche befüllt werden soll. Diese kann auch Strings (eigentlich PChars) beinhalten. So etwas möchte ich auch schreiben, bin aber ein wenig durcheinander, was die Speicherverwaltung betrifft. Angenommen, wir haben folgenden Record:
Delphi-Quellcode:
type
PTestDataA = ^TTestDataA;
TTestDataA = packed record
Number: integer;
AString: PAnsiChar;
end;
In meinem jetzigen Teststadium mache ich in der
DLL das hier:
Delphi-Quellcode:
procedure FillDataA(Data: PTestDataA); stdcall;
var
s: AnsiString;
sl: TStringlist;
begin
if Assigned(Data) then
begin
Data^.Number := 42;
sl := TStringlist.Create;
try
sl.Add('Eins');
sl.Add('Zwei');
sl.Add('Drei');
sl.Add('Vier');
sl.Add('Fünf');
sl.Add('Sechs');
sl.Add('Sieben');
sl.Add('Acht');
sl.Add('Neun');
sl.Add('Zehn');
s := AnsiString(sl.Text);
Data^.AString := AnsiStrAlloc(Length(s));
StrPCopy(Data^.AString, s);
finally
sl.Free;
end;
end;
end;
Aufruf innerhalb der Echse:
Delphi-Quellcode:
procedure TFormTest.ButtonFillClick(Sender: TObject);
var
Data: TTestdataA;
begin
FillDataA(@Data);
ShowMessage(Data.AString);
end;
Damit wurde der Speicher für den PAnsiChar innerhalb der
DLL reserviert. Wie gebe ich den denn wieder frei und wo? Oder geschieht das automatisch mittels irgendwelcher Compiler-Magic? Ich komme auf keinen grünen Zweig, möglicherweise funktioniert das ja überhaupt nicht so, wie ich das gern hätte. Kann mich mal jemand erleuchten?