![]() |
Billiger Datenaustausch zwischen Anwendungen und DLL's
Gibt bei folgender Implementierung Haken und Ösen, oder geht das prinzipiell in Ordnung?
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
type Tp=Procedure(s:TStreamAdapter); var ms:TMemoryStream; isa:TStreamAdapter; s:String; h:THandle; p:Tp; begin s :='Nur ein Test ohne weiteren Sinn'; ms := TMemoryStream.Create; isa:=TStreamAdapter.Create(ms); try ms.Write(s[1],Length(s) * SizeOf(Char)); h := LoadLibrary('ShowStream.dll'); if h <> 0 then try @p := GetProcAddress(h,'ShowAStream'); p(isa); finally FreeLibrary(h); end; finally isa.Free; ms.Free; end; end; ____________________________________________________ library ShowStream; uses SysUtils, Classes, Dialogs; {$R *.res} Procedure ShowAStream(isa:TStreamAdapter); var ms:TMemoryStream; s:String; begin ms:=TMemoryStream.Create; try ms.LoadFromStream(isa.Stream); SetLength(s,ms.Size); ms.Read(s[1],ms.Size); Showmessage(s); finally ms.Free; end; end; Exports ShowAStream index 1; begin end. |
AW: Billiger Datenaustausch zwischen Anwendungen und DLL's
Delphi-Quellcode:
Nur in Bezug auf das Try-Finally-Konstrukt. Wenn im Constructor von TStreamAdapter etwas schief geht, wird ms nicht freigegeben. Daher würde das so machen:
ms := TMemoryStream.Create;
isa:=TStreamAdapter.Create(ms); try [...] finally isa.Free; ms.Free; end;
Delphi-Quellcode:
Da .Free auf nil prüft ist so sichergestellt, dass immer beides freigegeben wird. :thumb:ms := nil; isa := nil; try ms := TMemoryStream.Create; isa:=TStreamAdapter.Create(ms); [...] finally isa.Free; ms.Free; end; Von dem Rest hab ich keine Ahnung. :stupid: |
AW: Billiger Datenaustausch zwischen Anwendungen und DLL's
Ich hab da noch im Hinterkopf, dass eine Übergabe von Objektinstanzen (hier: TStreamadapter) problematisch ist. Allerdings bin ich gerade nicht sicher, ob das nur für VCL-Objekte galt.
|
AW: Billiger Datenaustausch zwischen Anwendungen und DLL's
Zitat:
Auch wird es Problematisch wenn unterschiedliche Delphi-Versionen oder Compileroptionen verwendet werden (TMyType benötigt in DLL 40 Byte, aber in Exe 48-Byte). Wie soll da was klappen ... |
AW: Billiger Datenaustausch zwischen Anwendungen und DLL's
Was spricht gegen Variants oder einfache Speicherblöcke?
|
AW: Billiger Datenaustausch zwischen Anwendungen und DLL's
Zitat:
Wenn dann OleVariants. Aber beides sind alternativen. Kommt halt immer auf die API an was man machen will. |
AW: Billiger Datenaustausch zwischen Anwendungen und DLL's
wenn du schon TStreamAdapter verwendest, dann übergib doch ne interfacereferenz. TStreamAdapter implementiert IStream, damit kannst du dann in der DLL herrvorragend arbeiten
mal so aus der hüfte geschossen
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
type Tp=Procedure(const s: IStream); var ms:TMemoryStream; isa:IStream; s:String; h:THandle; p:Tp; begin s :='Nur ein Test ohne weiteren Sinn'; ms := TMemoryStream.Create; isa:=TStreamAdapter.Create(ms, soOwned); try ms.Write(s[1],Length(s) * SizeOf(Char)); h := LoadLibrary('ShowStream.dll'); if h <> 0 then try @p := GetProcAddress(h,'ShowAStream'); p(isa); finally FreeLibrary(h); end; finally isa := nil; end; end; ____________________________________________________ library ShowStream; uses SysUtils, Classes, Dialogs, ActiveX; {$R *.res} Procedure ShowAStream(const isa:IStream); var s:String; StatStg: TStatStg; StatFlag: LongInt; lPos: Int64; pRead; PLongInt; begin ms:=TMemoryStream.Create; try isa.stat(StatStg, StatFlag); setlength(s, StatStg.cbSize); isa.Seek(0, soFromBeginngin, lPos); isa.Read(PChar(s), StatStg.cbSize, pRead); Showmessage(s); finally ms.Free; end; end; Exports ShowAStream index 1; begin end. |
AW: Billiger Datenaustausch zwischen Anwendungen und DLL's
Danke Sebastian :thumb:
das war es was ich eigentlich tun/haben wollte ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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-2025 by Thomas Breitkreuz