Zitat:
Die sauberte Lösung wäre (falls Du D5 noch verfügbar hast) für diese
DLL eine Wrapper-
Dll zu bauen, die wie eine Windows
API-
DLL alle exportierten Funktionen mit stdcall calling convention und ausschließlich unter Verwendung von
API-kompatiblen Datentypen für Parameter und Rückgabewerte deklariert.
Das ist ein super Vorschlag und dürfte im Hinblick auf die StringList die einzig gangbare Lösung sein.
Mein Pointer Ansatz geht leider nicht wie gedacht. Man kann die Funktion nicht einfach anders deklarieren. Das gibt sofort einen crash.
Ich hatte mir das so gedacht:
Code:
function ExportString: AnsiString; external '..\..\Project1.dll'; // oder stdcall
procedure TForm1.Button1Click(Sender: TObject);
var s, s2 : AnsiString;
pa : PAnsiChar;
p : PInteger;
begin
s := ExportString;
pa := PAnsiChar(s);
p := PInteger(pa);
dec(p); // Length
SetString(s2, pa, p^);
Edit1.Text := s2;
dec(p); // RefCount
p^ := p^ + 1; // Verhindere Free auf den String
FreeMem(p); // String freigeben
end;
Es geht, aber k.A. ob es hier ein Speicher loch gibt.