Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi COM-Objekt freigeben (https://www.delphipraxis.net/5137-com-objekt-freigeben.html)

OregonGhost 25. Mai 2003 14:10


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.

Tietsch 26. Mai 2003 00:46

Re: COM-Objekt freigeben
 
Abend,
_Release gibt das Release aus, nicht das CoDomDocument frei.
Machs einfach so, das ist völlig ausreichend.
Code:
Doc:= NIL;
Kannst Dir dann auch die Abfrage auf nil sparen.

Tietsch

OregonGhost 26. Mai 2003 16:46

Zitat:

_Release gibt das Release aus, nicht das CoDomDocument frei.
Laut COM-Dokumentation soll das COM-Objekt sich freigeben, wenn durch Release der Referenzzähler auf 0 gesetzt wurde. Daher verstehe ich nicht ganz, wie du das meinst, vielleicht kannst du mir das nochmal genauer erklären.

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).

sakura 26. Mai 2003 17:14

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:...

Tietsch 27. Mai 2003 13:08

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 11:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz