Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TMemoryStream - DLL (delphi/Lazarus) (https://www.delphipraxis.net/81343-tmemorystream-dll-delphi-lazarus.html)

_frank_ 25. Nov 2006 13:00


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

SirThornberry 25. Nov 2006 13:07

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.

_frank_ 25. Nov 2006 13:12

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

SirThornberry 25. Nov 2006 13:16

Re: TMemoryStream - DLL (delphi/Lazarus)
 
TMemoryStream.Memory ist einfach nur ein einfacher Pointer welcher auf die Daten zeigt welche im Memorystream stehen.

_frank_ 25. Nov 2006 18:00

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:
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;
eine idee?

//edit: gibt es eine möglichkeit á la initialization/finalization um den speicher beim dll-unload aufzuräumen?

Frank

SirThornberry 25. Nov 2006 19:01

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.

_frank_ 25. Nov 2006 19:18

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

SirThornberry 25. Nov 2006 19:20

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.

Bernhard Geyer 25. Nov 2006 19:36

Re: TMemoryStream - DLL (delphi/Lazarus)
 
Zitat:

Zitat von _frank_
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...

"Lebende" Objekte zwischen DLL und Exe auszutauchen funktioniert nur wenn mit Laufzeitpackages gearbeitet wird. Ansonsten hast Du zwei völlig unabhänige Klassenbibliotheken und jeder Objektaustausch ist ein Glücksspiel.

DGL-luke 25. Nov 2006 19:47

Re: TMemoryStream - DLL (delphi/Lazarus)
 
Es wird nur ein Pointer auf einen Speicherbereich ausgetauscht, bernhard geyer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz