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