Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL Exportiert ein Interface mit Strings... (https://www.delphipraxis.net/180689-dll-exportiert-ein-interface-mit-strings.html)

Mavarik 9. Jun 2014 13:24

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von Sir Rufo (Beitrag 1261766)
Hauptproblem wird wohl sein, dass die DCU nicht für Unicode funktioniert.

Wenn du die Definition der Klasse kennst, dann erstelle dir diese Klasse neu (für die neuen Versionen).

Die Klasse selber holt sich eine Interface-Instanz von der DLL und reicht alle Anfragen darüber an die DLL durch und holt auch die Daten darüber zurück.

Am sinnvollsten wäre auch die Verwendung von
Delphi-Quellcode:
PAnsiChar
statt
Delphi-Quellcode:
WideString
und die neue Klasse benutzt als Parameter
Delphi-Quellcode:
AnsiString
statt
Delphi-Quellcode:
string
.

Unicode ist kein Thema... Geht von XE5 -> XE6. Die DLL soll aber auch mit Delphi 2007 Funktionieren..

himitsu 9. Jun 2014 14:13

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von Sir Rufo (Beitrag 1261766)
und die neue Klasse benutzt als Parameter
Delphi-Quellcode:
AnsiString
statt
Delphi-Quellcode:
string
.

Achtung: AnsiString ist nicht gleich AnsiString.

Mit Umstellung auf Unicode wurde das AnsiString erweitert und ist daher nicht mehr wirkltich kompatibel zueinander.


Die DLL mit einer alten Delphiversion kompiliert, kommt mit der alten DCU klar, aber das Interface, welches die DLL veröffentlicht sollte daher maximal WideString oder PAnsiChar verwenden.

Mavarik 9. Jun 2014 14:57

AW: DLL Exportiert ein Interface mit Strings...
 
OK..

Was ist mit einem TStream?

Mavarik

himitsu 9. Jun 2014 15:52

AW: DLL Exportiert ein Interface mit Strings...
 
Das ist eine Klasse? Siehe oben bei RTTI.
Und TMemoryStream, TStringStream, TBytesStream usw. geht auch wieder auf SharedMem hinaus.

Es gibt allerdings den IStream, aber der ist nicht kompatibel mit TStream's, wobei es dafür aber eine Wrapper-Klasse gibt.

Mavarik 9. Jun 2014 16:27

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von himitsu (Beitrag 1261772)
Es gibt allerdings den IStream, aber der ist nicht kompatibel mit TStream's, wobei es dafür aber eine Wrapper-Klasse gibt.

Wrapper-Klasse?

himitsu 9. Jun 2014 16:40

AW: DLL Exportiert ein Interface mit Strings...
 
TStreamAdapter

Mavarik 10. Jun 2014 09:51

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von Mavarik (Beitrag 1261774)
Wrapper-Klasse?

OK. :stupid: War vielleicht ein bisschen kurz...

Zitat:

Zitat von himitsu (Beitrag 1261775)
TStreamAdapter

Also habe ich keine bessere Antwort verdient...:stupid:
ok dann nochmal:

Danke für die Info zum IStream. Die Wrapper Klasse hier für habe ich gefunden. Hast Du ein Stück Beispiel-Code, wie man das
für eine bidirektionale Übergabe an eine DLL verwenden muss?

Grüsse Mavarik

himitsu 10. Jun 2014 10:22

AW: DLL Exportiert ein Interface mit Strings...
 
Eigentlich Recht einfach.

- TStream-Nachfolger können nicht direkt an IStream übergeben werden.
> TStream ist halt ein Delphi-Typ und ISteam kommt irgendwo aus dem OLE32, oder so.
> Gut, man hätte natürlich auf die Idee kommen können, die Methoden von IStream direkt in TStream einzubauen, damit man auch direkt darüber das IStream hätte supporten können, aber so schlau war wohl Keiner. :stupid:

Man nimmt also irgendeinen Stream, packt ihn in den TStreamAdapter und überlegt sich dann noch, wer für die Freigabe sorgen soll.

Delphi-Quellcode:
type
  IMyIntf = interface
    function GetStream: IStream;
    procedure PutStream(S: IStream);
  end;

function TMyClass.GetStream: IStream;
begin
  Result := TStreamAdapter.Create(FStream, soReference);
end;

function TMyClass.GetStream: IStream;
begin
  Result := TStreamAdapter.Create(TFileStream.Create('Test.dat', 0), soOwned);
end;


begin
  MyIntf.PutStream(TStreamAdapter.Create(FStream, soReference));
end;

begin
  MyIntf.PutStream(TStreamAdapter.Create(TFileStream.Create('Test.dat', 0), soOwned));
end;

Mavarik 10. Jun 2014 11:25

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von himitsu (Beitrag 1261804)
Eigentlich Recht einfach.

Man nimmt also irgendeinen Stream, packt ihn in den TStreamAdapter und überlegt sich dann noch, wer für die Freigabe sorgen soll.

OK

Delphi-Quellcode:
Procedure Machwas(A,B:TStream);
var
  StreamA,
  StreamB : IStream;
begin
  StreamA := TStreamAdapter.Create(A,soReference);
  StreamB := TStreamAdapter.Create(B,soReference);
  DLL_MachWas(StreamA,StreamB); // Soweit richtig?
  // Und dann? 
end;
Wenn die DLL_MachWas mit den Streams arbeitet? Wie kommt der Inhalt wieder zurück in A & B
oder arbeitet die DLL dann auf A & B oder einer Kopie?

Mavarik

himitsu 10. Jun 2014 12:01

AW: DLL Exportiert ein Interface mit Strings...
 
Das bleibt die ganze Zeit da drin.

Der Stream-Adapter leitert nur alle Zugriffe auf die TStream-Klasse um, welche über seine Methoden gemacht werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.
Seite 2 von 4     12 34      

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