AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Billiger Datenaustausch zwischen Anwendungen und DLL's
Thema durchsuchen
Ansicht
Themen-Optionen

Billiger Datenaustausch zwischen Anwendungen und DLL's

Ein Thema von Bummi · begonnen am 22. Dez 2011 · letzter Beitrag vom 22. Dez 2011
Antwort Antwort
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#1

Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 12:37
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 12:46
Delphi-Quellcode:
   ms := TMemoryStream.Create;
   isa:=TStreamAdapter.Create(ms);
   try
[...]
   finally
     isa.Free;
     ms.Free;
   end;
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:
Delphi-Quellcode:
   
   ms := nil;
   isa := nil;
   try
   ms := TMemoryStream.Create;
   isa:=TStreamAdapter.Create(ms);
[...]
   finally
     isa.Free;
     ms.Free;
   end;
Da .Free auf nil prüft ist so sichergestellt, dass immer beides freigegeben wird.

Von dem Rest hab ich keine Ahnung.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.545 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 13:00
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 13:08
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.
Es ist immer problematisch da die is und as-Operatoren nur funktionieren wenn DLL und Exe gemeinsame Runtime haben.
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 ...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#5

AW: Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 13:11
Was spricht gegen Variants oder einfache Speicherblöcke?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 13:13
Was spricht gegen Variants oder einfache Speicherblöcke?
Variants (nicht OleVariants) sind eine Delphi-Implementierung seit D6. D.h. u.U. auch inkompatible zwischen Versionen.
Wenn dann OleVariants.

Aber beides sind alternativen. Kommt halt immer auf die API an was man machen will.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
snook

Registriert seit: 25. Jun 2010
94 Beiträge
 
Delphi 2005 Professional
 
#7

AW: Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 13:44
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.

Geändert von snook (22. Dez 2011 um 14:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: Billiger Datenaustausch zwischen Anwendungen und DLL's

  Alt 22. Dez 2011, 14:01
Danke Sebastian

das war es was ich eigentlich tun/haben wollte ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
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