![]() |
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 14:31 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