![]() |
TMemoryStream - DLL (delphi/Lazarus)
Hi,
weis jemand, wie man einen TMemoryStream (oder etwas vergleichbares) vom (Delphi-) Hauptprogramm an eine Dll (Delphi+Lazarus) geben kann und wieder zurück? Ich denke mal PChar ist das nicht die richtige Wahl, da in der Binärvariante evtl. auch #0-Zeichen vorkommen. weiterhin möchte ich vermeiden, eine temporäre Datei zu schreiben (wenn möglich). Sinn und Zweck der Sache soll sein, dass ich die Binärform-Dekodierung (ObjectBinaryToText, ObjectTextToBinary) in Dlls auslagere um z.B. auch forms aus Lazarus-exen bzw. neuerer Delphi-Versionen zu importieren. Gruß Frank |
Re: TMemoryStream - DLL (delphi/Lazarus)
ein einfacher Pointer mit Längenangabe sollte reischen. Der einfache Pointer kann natürlich auch ein PChar sein.
Wenn du einen TMemoryStream hast kannst du als Pointer gleich "MemoryStream.Memory" übergeben. |
Re: TMemoryStream - DLL (delphi/Lazarus)
mhm...ist halt die frage, ob delphis TMemoryStream gleich dem von Lazarus ist...
stehen in TMemoryStream.Memory wirklich nur meine Daten ohne Header etc? Wenn dem so ist, sollte es funktionieren... Gruß Frank |
Re: TMemoryStream - DLL (delphi/Lazarus)
TMemoryStream.Memory ist einfach nur ein einfacher Pointer welcher auf die Daten zeigt welche im Memorystream stehen.
|
Re: TMemoryStream - DLL (delphi/Lazarus)
so mein erster versuch, jedoch bekomme ich die daten nicht zurück, damit ich den stream in der dll freigeben kann...
Delphi-Quellcode:
eine idee?
function oBinaryToText(InData:Pointer;inLen:integer;OutData:Pointer;var outLen:integer):boolean;
var ms,ms2:TMemoryStream; begin ms:=TMemoryStream.Create; ms.ReadBuffer(inData,inLen);//sollte so funktionieren, denk ich ms.Position:=0; ms2:=TMemoryStream.Create; ObjectBinaryToText(ms,ms2); ms2.Position:=0; //wie ms2.memory in die hauptanwendung bekommen?? ms2.free; ms.free; result:=true; end; //edit: gibt es eine möglichkeit á la initialization/finalization um den speicher beim dll-unload aufzuräumen? Frank |
Re: TMemoryStream - DLL (delphi/Lazarus)
du kannst indirekt auch in DLL's Initialization und Finalization ohne größere Probleme errischen. Erstelle einfach eine neue Unit und binde diese in die DLL-Project-Datei ein. In dieser Unit kannst du ohne Probleme Initialization und Finalization einbaune. Zudem ist die Projektdatei aufgeräumt.
|
Re: TMemoryStream - DLL (delphi/Lazarus)
ist das so möglich eine globale stream-variable zu erstellen (initialization) und diese im finalization freizugeben, dazwischen nur mit pointer mit dem hauptprogramm zu kommunizieren?
oder gibt es da evtl. bessere Möglichkeiten? Gruß Frank |
Re: TMemoryStream - DLL (delphi/Lazarus)
eine bessere möglichkeit wenn das Hauptprogramm eine Funktion der DLl aufruft welche den Stream erstellt und das Hauptprogramm auch eine Funktion aufruft die den Stream wieder zerstört.
|
Re: TMemoryStream - DLL (delphi/Lazarus)
Zitat:
|
Re: TMemoryStream - DLL (delphi/Lazarus)
Es wird nur ein Pointer auf einen Speicherbereich ausgetauscht, bernhard geyer.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz