Stopp, ich muss mich entschuldigen, ich habe Blödsinn geschrieben, weil ich was falsch verstanden hatte.
Du hast eine
DLL, die Du in Delphi schreibst und die diese Funktion exportiert:
Delphi-Quellcode:
function GetExportPtr(Path, Delimiter): PAnsiChar;
var
strExport: string;
begin
// [...]
ExportPtr := AnsiStrAlloc(Length(strExport) + 1);
CopyMemory(ExportPtr, PAnsiChar(AnsiString(strExport)), Length(strExport) + 1);
Result := ExportPtr;
end;
Korrekt?
Und diese Funktion soll nicht nur von Delphi aus sondern auch aus anderen Programmiersprachen heraus aufgerufen werden können.
(Irgendwas stimmt da nicht, die Parameter haben keinen Typ.)
Prinzipiell ist es bei der Übergabe von Strings an DLLs so, dass man sich entscheiden muss, wer den Speicher alloziert und wer ihn frei gibt. Üblicherweise macht das der Aufrufer:
Delphi-Quellcode:
var
Res: integer;
Buffer: Array[0..255] of AnsiChar;
s: AnsiString;
begin
Res := MyDllFunction(@Buffer, SizeOf(Buffer));
s := PAnsiChar(@Buffer);
end;
In der
DLL wird dann der übergebene Speicherbereich gefüllt:
Delphi-Quellcode:
function MyDllFunction(_Buffer: PAnsiChar): integer; stdcall;
var
s: string;
as: AnsiString;
begin
s := IrgendwasDasDenStringLiefert;
as := s;
StrCopy(PAnsiChar(as[1]), _Buffer);
Result := Length(as);
end;
Die Alternative wäre, dass die
DLL eine Funktion exportieren muss, die Speicher frei gibt. An die übergibt man dann den aus der
DLL zurückgelieferten PAnsiChar zur Freigabe. Das ist aber in der Regel zu aufwändig.