Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#15

AW: String aus D5 DLL in Delphi 10.2 einslesen

  Alt 15. Jul 2019, 17:45
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.
Wie gesagt, Ansistring istnicht kompatibel mit einem D5 String, sieh die mal die Abschnitte über das memory layout von Strings im Delphi Language Guide der beiden Versionen an. Und wenn Du schonmal dabei bist, auch die Infos darüber, wie Funktionen mit komplexen Rückgabewerten wie String implementiert werden: in Wirklichekeit ist das nämlich

procedure ExportString(var S; string); d.h. der Aufruf übergibt die Addresse der Variable s an die Dll, die dann im Speicher der Hostanwendung herumpfuscht.
Peter Below
  Mit Zitat antworten Zitat