![]() |
Interfaces und die DLL/Anwendung Grenze.
Hallo,
es gibt bereits einen ähnlichen Thread von heute, aber ich habe eher allgemeine Fragen. Es gibt ja das Problem das Objekte in Anwendungen und DLL unterschiedliche RTTI Vectoren haben, weshalb der IS Parameter nicht Funktioniert und es einige Risiken gibt wenn unterschiedliche Compilerschalter benutzt wurden wenn man ein Objekt über die DLL/Anwendungs Grenze hinweg verwendet. Nun habe ich des Öfteren vernommen, das es durchaus möglich ist Objekte in einer DLL zu erzeugen und sie als INTERFACE in die Anwendung weiter zu geben. Ebenso auch umgekehrt. 1. Was muss ich dabei beachten? 2. Funktioniert die Referenzzählung über die DLL/Anwednungsgrenze hinaus?(müsste sie ja eigentlich) 3. Was ist mit Interfaces die String Parameter haben? Sharemem oder nicht? |
Re: Interfaces und die DLL/Anwendung Grenze.
1. Nix, du musst nur die gleiche IID (GUID) verwenden. Das ist ja auch das einzige, worauf sich ein Interface bezieht, da es ja keine RTTI besitzt.
2. ja klar 3. Nach wie vor genauso ungünstig. Da ändert sich leider nichts. |
Re: Interfaces und die DLL/Anwendung Grenze.
Zitat:
|
Re: Interfaces und die DLL/Anwendung Grenze.
@MKinzler:
Warum WideString? Ist das nicht auch nur ein PWidechar? Gibts dazu bessere Compiler Magic? |
Re: Interfaces und die DLL/Anwendung Grenze.
aus
![]() Zitat:
|
Re: Interfaces und die DLL/Anwendung Grenze.
Muss ich die WideStrings dann zur weiteren Verabreitung noch mal zu DelphiSTRING Strings konvertieren, oder macht der
compiler das von alleine? Reicht ein Type Cast(vermutlich nicht)? Gibt es die Stringfunktionen auch alle für widestring? wenn ja , warum sollte man dann überhaupt noch Delphistrings benutzen? Sind die WideStrings imperformanter? Sorry, aber irgendwie brauch ich mehr input. |
Re: Interfaces und die DLL/Anwendung Grenze.
man kann String und WideString gegenseitig zuweisen. mehr aber nicht. WideString ist kein nativer Stringtyp. es wird keine Referenzzählung unterstützt.
|
Re: Interfaces und die DLL/Anwendung Grenze.
Zitat:
...dann muss ich mich aber auch um Instanzierung und Freigabe selbst kümmern? |
Re: Interfaces und die DLL/Anwendung Grenze.
Es kommt darauf an, was du alles mit dem String anfangen willst. String ist zwar performanter, aber durch ständiges umkopieren, geht dieser Vorteil schnell flöten.
Zitat:
|
Re: Interfaces und die DLL/Anwendung Grenze.
Ich sehe gerade man kann Widestrings nur mit eigenen Funktionen vergleichen etc. ? Wie in C .
Muss ich Widestring speicher eigenständig anfordern? Und wenn keine Referenzzählung unterstützt wird wie gebe ich Widestrings wider frei? Gehen Widestrings nur über Getmem und Freemem? |
Re: Interfaces und die DLL/Anwendung Grenze.
Quatsch. Widestrings werden genauso durch Compiler-Magic verwaltet wie normale Strings. Es gibt allerdings tatsächlich keine Referenzzählung, was bedeutet, dass bei einer einfachen Zuweisung bereits eine Kopie gemacht wird. Wenn dir aber Performance nicht so wichtig ist, musst du dich um nichts kümmern.
|
Re: Interfaces und die DLL/Anwendung Grenze.
OK, und die Kopien werden dann Freigegeben wenn die Variable vom Stack verschwindet oder z.B. Ein Array of Widestring
verkleinert wird? |
Re: Interfaces und die DLL/Anwendung Grenze.
Exakt. Genau wie normale Strings, dynamische Arrays, Variants und Interfaces werden WideStrings automatisch finalisiert.
|
Re: Interfaces und die DLL/Anwendung Grenze.
Zitat:
|
Re: Interfaces und die DLL/Anwendung Grenze.
OK, was passiert wenn ich widestrings on eine Procedur übergebe
Delphi-Quellcode:
copy on write ? oder Kopiert er den Widestring auch wenn ich ihn nur lesen will?
Procedure(s:Widestring);
Begin end; also würde DAS
Delphi-Quellcode:
notwendig werden?
Procedure(var s:Widestring);
Begin end; //oder Procedure(in s:Widestring); Begin end; |
Re: Interfaces und die DLL/Anwendung Grenze.
Für die Performance wäre var bzw. const besser. Ansonsten wird kopiert.
(Seit wann gibt es "in"?) Edit: Mach dir aber deswegen keinen all zu großen Kopf in anderen Programmiersprachen wird immer und ständig kopiert (z.B. Java). Es ist nur ein kleiner Vorteil von Delphi den du damit über Bord wirfst. Fang deswegen ja nicht, ständig zwischen String und Widestring zu wechseln. Diese Zuweisungen dauern noch viel länger. Edit2: Aber nochmal zu deiner eigentlichen Frage. Warum kann man Objekte nicht über DLL-Grenzen hinaus liefern? Das geht ja anscheinend nur so lange, wie du bereits mitgelieferte Klassen aus Delphi verwendest. Das Problem springt dir ja sofort ins Auge, wenn du eine eigene Klasse verwendest. Bsp: Erstelle in einer EXE eine Klasse:
Delphi-Quellcode:
Diese Klasse kannst du jetzt noch fertig implementieren.
type TmyClass=class
procedure Foo; end; Nachher willst du diese Klasse an die DLL übergeben. Und hier siehst du, jetzt kennt die DLL die Klasse nicht. Es reicht auch nicht aus, den Header nur zu schreiben. Du müsstest für die Klasse in der DLL auch eine eigene Implementation schreiben. Damit erkennst du, dass die Klassen nur den gleichen Namen haben, aber niemals den gleichen Inhalt (auch, wenn du sie gleich implementierst). Außerdem ist es ja witzlos eine Klasse zweimal zu implementieren. Aber genau das würdest du machen, wenn du bspw eine StringList an die DLL übergibst. Du hättest die StringList zweimal in deinem Process. Wenn du jetzt ein Interface verwendest:
Delphi-Quellcode:
...dann reicht es eben aus, nur den Header in die DLL zu kopieren. Das Interface hat ja auch keine Implementation.
type ImyClass=interface
['{8105D05C-D7F1-41A3-B98C-860E5B89FBD8}'] procedure Foo; end; TmyClass=class(TInterfacedobject,ImyClass) procedure Foo; end; Wenn du dir das bewusst machst, siehst du dass (unabhängig von Referenzzählung und allen anderen Vorteilen von Interfaces) nur Interfaces verwendet werden können. |
Re: Interfaces und die DLL/Anwendung Grenze.
Zitat:
Zitat:
Zitat:
benutzt nur noch mit Sharemem und sobald man das in größerem Umfang macht findet man Fehler nicht mehr, weil sich z.B. Packages die DLLs einbinden welche Objekte erzeugen die in der Anwendung direkt genutzt werden dann auf einmal zwar Kompilieren lassen und auch verwenden lassen nur leider nicht als Designtime Package installieren lassen...aus heiterem himmel...etc. (Bei mir war der Grund wohl eine neue ElevateDB Version da hat da gab es Unterschiede in DLL und Anwendung die aus dcu leichen herrührten...etc.) Außerdem nutze ich zur Laufzeit eingebundene DLLs und zur Laufzeit eingebundene Packages ....aus heraus und hinein Packages kann man Klassen ja super verwenden. Es geht mir nicht darum anderen Entwicklern eine fertige DLL zur Verfügung zu stellen sondern die Logik die hinter einer "Fassade" steht per DLL(oder Package) beim Kunden austauschen zu können. Werde vermutlich einges auf Interfaces mit WideStrings umstellen, weil ich mir so den Ärger mit den Persistenten Objekten erspare. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 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