AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

COM-Objekt freigeben

Ein Thema von OregonGhost · begonnen am 25. Mai 2003 · letzter Beitrag vom 27. Mai 2003
Antwort Antwort
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#1

COM-Objekt freigeben

  Alt 25. Mai 2003, 15:10
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Tietsch

Registriert seit: 8. Mai 2003
Ort: Stuttgart
5 Beiträge
 
Delphi 6 Professional
 
#2

Re: COM-Objekt freigeben

  Alt 26. Mai 2003, 01:46
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
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#3
  Alt 26. Mai 2003, 17: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).
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#4
  Alt 26. Mai 2003, 18: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.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Tietsch

Registriert seit: 8. Mai 2003
Ort: Stuttgart
5 Beiträge
 
Delphi 6 Professional
 
#5
  Alt 27. Mai 2003, 14: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.
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)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 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