AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi COM: TInterfacedObject-Nachfahren explizit freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

COM: TInterfacedObject-Nachfahren explizit freigeben

Ein Thema von Udontknow · begonnen am 11. Okt 2002 · letzter Beitrag vom 14. Okt 2002
 
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#3
  Alt 11. Okt 2002, 10:01
Hi! Danke für die schnelle Antwort!

Also,
mit Garbage-Collection meinte ich auch kein COM-Feature, sondern das Feature von Delphi, das ja, sobald eine IInterface-Variable Out-Of-Scope geht bzw. auf NIL gesetzt wird, eben die Routine _Release aufruft. Genau das ist die Problematik!

Zu 1.
Habe ich auch probiert. Alle Zeiger auf untergeordnete Objekte auf NIL setzen. So weit so gut, aber was ist, wenn die inneren Objekte sich daraufhin nicht zerstören (z.B. weil ein Client, der mein Programm automatisieren will, per COM-Schnittstelle eben noch eine Referenz auf ein untergeordnetes Objekt hat)? Dann ist zwar die Referenz vom Hauptobjekt zum Detailobjekt weg, aber das Detailobjekt schwirrt aufgrund der noch vorhandenen Referenz durch irgendein anderes unbestimmbares Client-Objekt noch immer im Speicher herum. Der Client könnte an dem Objekt Manipulationen vornehmen, ohne zu wissen, das dieses Objekt gar nicht mehr Bestandteil der eigentlichen Anwendung ist.

Zu 2.
Das ist ja der Knackpunkt, es gibt keine Möglichkeit, die Referenzen von ausserhalb zu ermitteln! Nur die Anzahl der Referenzen wird mir von TInterfaced-Object bereitgestellt. Ich habe keine Chance, sämtliche Objekte zu ermitteln, die ein Interface auf eines meiner Objekte haben.
Ich habe auch schon versucht, _Addref und _Release aussen vor zu lassen, indem ich diese Methoden übersteuere und dort nichts tue, und einfach das Objekt per Free freizugeben, aber das bewirkt dann (vermutlich aufgrund dieser Delphi-Garbage-Collection) Zugriffsschutzverletzungen direkt nach Beendigung des Destruktors.

Zu 3.
Dann ist meine Applikation aber nicht mehr automatisierbar im Sinne von COM, und das ist ja gerade das Ziel! Im Moment übergebe ich tatsächlich überall nur Objektzeiger im Sinne von TMeinObjekt, und das macht auch gar keine Schwierigkeiten, da ich eben die Gewalt über die Lebenszeit aller Objekte habe.
Aber jetzt, wo ich auf COM umstellen will, stehe ich vor einem grossen Problem. Wenn bei traditionellem OOP irgendwo Referenzen auf ein schon freigegebenes Objekt vorliegen, kommt es bei Benutzung derer zu einer Zugriffsschutzverletzung, und das wars. Bei COM allerdings kann man munter weiter mit den Objekten arbeiten, bis dann plötzlich ganz merkwürdige Fehler auftreten!

Verzwickte Situation...

Cu,
Udontknow
  Mit Zitat antworten Zitat
 


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 12:37 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