Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2
  Alt 11. Okt 2002, 10:02
Hi,

erst einmal zum Begriff "Garbage-Collection" COM unterstützt eine solche Garbage-Collection nicht in diesem Sinne. COM Objekte werden, wie Du es bereits geschrieben hast, durch Referenzzähler "am Leben" erhalten.

Wenn auf ein COM Objekt verwiesen wird, so wird bei Delphi automatisch die Methode _AddRef aufgerufen, welche den Referenzzähler um eins erhöht. Wenn der Verweis auf ein COM Objekt verfällt oder gelöscht wird, so wird die Methode _Release aufgerufen. Dadurch wird der Referenzzähler um eins verringert. Erreicht dieser 0, so wird vom Objekt die Methode Destroy aufgerufen. ("Auto-Referenced Objects")

Wenn Du jetzt Referenzen zwischen zusammenhängenden Objekten verteilen musst, dann gibt es grundlegend drei Möglichkeiten.

1. (unfein ) Das von "aussen" erstellte Objekt muss via einem Sonderaufruf (z.B. Object.AllDone) informiert werden, dass es intern all Referenzen auf von ihm erstellte Objekte freigeben soll.

2. (sehr schwer realisierbar) Du erstellst in Deinen Objekte eine Methode zum Override der Funktionen
Code:
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
; Diese müssen dann die entsprechenden Verhältnisse prüfen und gegebenenfalls Referenzen freigeben.

3. (hat auch Vor- und Nachteile) Du übergibst zwischen den erstellten Objekten nicht die COM-Schnittstellen sondern die Objekte selbst. Dadurch verlierst Du leider die Garantie, das ein referenziertes Objekt wirklich noch existiert, ausser Du kreierst eine Art "Event-Sink", an dem sich das referenzierende Objekt anmeldet, um zu erfahren, sobald das referenzierte Objekt zerstört wird.

Ich hoffe das hat geholfen.

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