Lassen Sie eine .net-Assembly in Delphi über COM aufrufen.
%Vor%Muss ich etwas tun, um es zu zerstören, um Speicher freizugeben. Oder nicht?
Sie sollten den Speicher besser mit
freigeben %Vor% Wenn Sie es nicht mehr brauchen. Besser mit einem try...finally intf := nil;
-Block oder in der Destroy
überschriebenen Methode, wenn intf
als fIntf
definiert ist, d. H. Als Klasseneigenschaft.
Wenn intf
auf dem Stack definiert ist, werden wir am Ende der Methode automatisch freigegeben. Es gibt einen versteckten try...finally intf := nil; end
-Block, der vom Compiler generiert wurde, um die intf
-Instanz freizugeben.
COM-Objekte sind Referenzzähler, und sie werden automatisch zerstört, wenn der Referenzzähler Null erreicht. Der Compiler fügt den Methoden _AddRef
und _Release
interface automatisch Aufrufe hinzu, wenn der Code einen Verweis auf das Objekt hinzufügt oder entfernt. Das Setzen einer Variable, die auf ein COM-Objekt auf nil
verweist, ruft _Release
auf (dekrementiert die Referenzzählung), und wenn die Referenzzählung Null erreicht, wird das Objekt ebenfalls freigegeben (dies ist nicht der Fall, wenn die Referenzzählung nicht null ist). Wenn eine Variable den Gültigkeitsbereich verlässt (d. H. Eine lokale Variable, wenn die Prozedur beendet wird), ruft der Compiler auch _Release
auf, wenn die Variable auf ein COM-Objekt (oder eine Referenz-gezählte Delphi-Schnittstelle) verweist.
Alle COM-Schnittstellen müssen IUnknown
:
IUnknown
stellt zwei Dienste bereit. Zuallererst ermöglicht QueryInterface
Clients, die anderen Schnittstellen zu erhalten, die das Objekt implementieren kann. Der zweite Dienst ist der der Lebenszeitverwaltung.
Jedes Mal, wenn Sie eine Referenz auf ein COM-Objekt nehmen, müssen Sie _AddRef
aufrufen. Jedes Mal, wenn Sie einen Verweis auf ein COM-Objekt aufgeben, müssen Sie _Release
aufrufen.
Die kanonische Implementierung von _AddRef
und _Release
ist für das implementierende Objekt, um eine Referenzzählvariable zu pflegen, die inkrementiert und dekrementiert wird, wenn Referenzen genommen und freigegeben werden. Wenn ein Aufruf von _Release
diesen Verweiszähler auf 0 setzt, zerstört sich das Objekt selbst.
Die Delphi-Implementierung von Schnittstellen verwaltet die Aufrufe von _AddRef
und _Release
in Ihrem Auftrag. Wenn Sie eine Schnittstellenvariable zuweisen, gibt der Compiler folgenden Code aus:
_Release
auf der Schnittstelle auf, auf die sich die Variable zuvor bezog, wenn sie sich vorher tatsächlich auf etwas bezog. _AddRef
für die Schnittstelle auf, auf die sich die Variable bezieht. Der Compiler sorgt auch dafür, dass _Release
aufgerufen wird, wenn die Variable den Bereich verlässt.
Dies bedeutet, dass Sie keine besonderen Maßnahmen ergreifen müssen, um sicherzustellen, dass Ihre COM-Objekte zerstört werden. Sie werden natürlich zerstört, wenn die letzte Referenz auf das Objekt den Geltungsbereich verlässt.
Wenn Sie jedoch ein Objekt vorzeitig zerstören möchten, weisen Sie nil
einfach der Variablen zu, die die Schnittstelle enthält. Beachten Sie, dass dies natürlich voraussetzt, dass keine anderen Referenzen auf diese Schnittstelle gehalten werden.
Das Objekt wird automatisch freigegeben. Wenn Sie jedoch den Verweis, den die Variable intf
enthält, explizit freigeben möchten, können Sie ihn auf Null setzen.