![]() |
Hab' ich das richtig verstanden mit DelphiCOM ?
Hab' ich das richtig verstanden mit DelphiCOM ?
Wenn ich eine Klasse von TInterfaceObject ableite, dann übernimmt Delphi das Referencecounting für Instanzen meiner Klasse? Sobald die Variable außerhalb des Gültigkeitsbereichs geht, ruft Delphi automatisch _Release und damit Free auf? Es kommt also nur auf die drei Methoden (_Addref, _Release, QueryInterface) an? Sehe ich das richtig? THX |
Re: Hab' ich das richtig verstanden mit DelphiCOM ?
Ja, aber immer daran denken was dazu führt, dass es überhaupt zur Referenzzählung kommt.
Interfaceinstanzen sollten IMMER als const übergeben werden. Diese werden dann kein _AddRef oder Release bekommen. Es ist also problemlos möglich eine Objektreferenz per const an eine Methode zu übergeben ohne dass dir die Instanz unterm Hintern weg gemopst wird. Außerdem musst du aufpassen wenn du eine 2-seitige Beziehung zwischen 2 Interfaces hast. Wenn nicht speziell implementiert würden sich beide Referenzen ewig am Leben halten. Du solltest dir in so einem Fall eine Hierarchie ausdenken: Einer von beiden besitzt den anderen. Der Owner kann weiterhin eine Referenz auf den anderen halten, währen der andere nur einen Pointer als Feld bekommt. Du kannst weiterhin eine Property vom Typen des Owners haben, aber das Feld sollte nur ein Pointer sein. Oh und zurück zur eigentlichen Frage: Damit QueryInterface (und damit Type casts) funktioniert sollten ALLE Interfaces eine GUID haben. (Ctrl + Shift + G) |
Re: Hab' ich das richtig verstanden mit DelphiCOM ?
Danke für die ausführliche Antwort.
Ich wollte eigentlich nur mal das Zeugs nachahmen, was mit C++ selbstverstädlich ist: Stack basierende Objekte, die nur im Gültigkeitsbereich existieren. Das Rererencecountingzeugs kenne ich gut - darüber gab es schöne Klausuren mit fiesen Sachen. Ich hoffe nur mal, dass mein Leakmanager solche Objekte auch findet. Muss ich mal testen. Es geht eigentlich darum, dass man einen Thread solange personifzieren (engl. to impersonate) kann, wie der Gültigkeitsbereich lebt.
Delphi-Quellcode:
Wie würde man am einfachsten hier das Objekt erzeugen, damit es nach end; automatisch gelöscht wird?
type TSecurityImpersonation = class(TInterfacedObject)...end;
var p : TSecurityImpersonation; begin // end;//p wird hier automatisch gelöscht. |
Re: Hab' ich das richtig verstanden mit DelphiCOM ?
Liste der Anhänge anzeigen (Anzahl: 1)
Dann schaue dir mal das hier im Anhang an:
Delphi-Quellcode:
Wenn du allerdings ein ISecurityImpersonation hast (also en Interface mit den Methoden, die du brauchst), dann deklariere die lokale Variable einfach als da Interface und alles passiert von alleine.
var
p : TSecurityImpersonation; sl : TSTringlist; begin p := TSecuritonation.Create(); AutoPointer.Wrap(p); sl := TStringList.Create(); AutoPointer.Wrap(sl); // ... end;//p wird hier automatisch gelöscht, sl auch |
Re: Hab' ich das richtig verstanden mit DelphiCOM ?
Sowas in der Art habe ich mir gedacht.
Bis jetzt habe ich nur in C++ COM gemacht. Ich dachte eigentlich, das Delphi irgendwie abschottet und im Hintergrund macht, so dass man einfach .Create verwendet. Ich wollte die Klasse so einfach wie möglich verwendbar machen. Kann man das ganze nicht auch ohne .Wrap machen, welches man gerne vergißt? Ist das AutoPointer von dir? |
Re: Hab' ich das richtig verstanden mit DelphiCOM ?
Zitat:
Wenn du ein Interface anbietest, das man dann als Typ der lokalen Variable nutzen kann, dann ist ziemlich eindeutig was passiert. Du kannst natürlich auch nur eine Factory anbieten, so dass jeder außer dir nur das Interface benutzen kann. Wenn ich "AutoPointer.Wrap(someInstance)" schreibe, dann sollte hoffentlich klar sein was passiert. Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:36 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