![]() |
COM-Objekt freigeben
Ich erzeuge im OnCreate ein COM-Objekt, und im OnDestroy möchte ich es mit _Release wieder freigeben. Aber kurz vor Ende des Programms wird selbiges in der Entwicklungsumgebung angehalten, bzw. wenn man es außerhalb startet, kommt Runtime Error 216 (was immer das sein möge). In einem vorherigen Test kam eine EExternalException in der NTDLL.DLL. Das COM-Objekt wird korrekt erzeugt und ich kann es benutzen. Wenn ich es nicht freigebe, wird die Anwendung korrekt beendet. Ich benutze Delphi 3 Professional und Windows XP ohne Service Pack. Was mache ich falsch bzw. was fehlt noch?
Delphi-Quellcode:
unit Test;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComObj, MSXML2_TLB; const CLSID_DOMDocument40: TGuid = '{88d969c0-f192-11d4-a65f-0040963251e5}'; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Doc: IXMLDOMDocument2; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Doc := CreateComObject(CLSID_DOMDocument40) As IXMLDOMDocument2; end; procedure TForm1.FormDestroy(Sender: TObject); begin if (Doc <> nil) then Doc._Release; end; end. |
Re: COM-Objekt freigeben
Abend,
_Release gibt das Release aus, nicht das CoDomDocument frei. Machs einfach so, das ist völlig ausreichend.
Code:
Kannst Dir dann auch die Abfrage auf nil sparen.
Doc:= NIL;
Tietsch |
Zitat:
Aber insgesamt hast du recht, mittlerweile las ich in der Delphi-Hilfe, dass Delphi automatisch _Release aufruft, wenn das Objekt den Gültigkeitsbereich verlässt (sprich wenn das Elternobjekt zerstört wird). |
Wenn Du die Referenz auf ein Interface (z.B. Doc) auf nil setzt, bzw. auf ein neues Interface setzt, dann wird von Delphi automatisch die Methode _Release aufgerufen. Release zählt den internen Referenz-Counter um 1 nach unten. Erreicht dieser 0, zerstört das Objekt sich selbst.
Entsprechend implementiert Delphi den Aufruf, um den Referenzzähler zu erhöhen, wenn Du eine neue Interface-Variable hinzufügst. ...:cat:... |
Habe neulich erst mit diesem IXMLDomDocument gearbeitet und hatte dieses _release problem auch. Die Hilfe zu diesem Teil hab ich so verstanden, daß ich mit Release die Version ausgeben kann. Habs allerdings einfach mal geglaubt und nicht getestet. :oops:
Anscheinend sollte ich mal wieder ein wenig das englisch auffrischen, oder ich hab von was völlig anderem geredet, und zufällig ins schwarze getroffen. 8) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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