2009-06-26 1 views
2

Ich schreibe einen COM-EXE-Server, der eine Klasse verfügbar macht, die eine Systemressource sperren. In der normalen Ausführung gibt der Client die Ressource frei (die ausführbare COM-Datei wird ein paar Sekunden später heruntergefahren. In einer abnormalen Ausführung stürzt die Client-App ab und lässt den Com-Server mit einer Instanz mit einer positiven Referenzzahl zurück. Die ausführbare COM-Datei wird für ~ 12 ausgeführt Minuten bis zur Beendigung, dh die Systemressource ist während dieser Zeit gesperrterkennen Clientprozessbeendigung von EXE COM-Server

Gibt es eine Möglichkeit, die Client-Terminierung sofort zu erkennen, wie im Socket-IPC oder Treiberprotokoll, wenn COM nicht mit anderen IPC vergleichbar ist

Antwort

1

Ich hatte die gleiche Frage vor ein paar Jahren.Ich fand die Antwort hier: How To Turn Off the COM Garbage Collection Mechanism.Kurz: Nein, es gibt keine Möglichkeit, Client Kündigung Instantlane zu erkennen y. Auszüge:

Wenn ein COM-Client endet normalerweise, es gibt alle Verweise auf seine Serverobjekt. Wenn ein Client jedoch abnormal beendet wird, gibt möglicherweise ausstehende Verweise auf das Serverobjekt . Ohne einen Müll Sammelmechanismus, hat der Server-Code keine Möglichkeit zu wissen, wann die Ressourcen für das COM Objekt, die dann eine Ressource Leck verursachen können, zurückfordern können. Um dieses Problem implementiert COM einen automatischen Speicherbereinigungs Mechanismus, bei dem die COM-Resolver Prozess (RPCSS) auf der Client-Maschine Pings der Server Maschine im Auftrag des Client Prozesses.

Alternativen zur Verwendung von GC Protokoll des COM (beispielsweise periodische Anwendungsebene „Pings“ können - Methode Anrufe, die das Objekt informieren, dass Kunden noch am Leben sind, oder ein zugrunde liegenden Transportmechanismus wie TCP Keepalives) sind nachweislich viel weniger effizient. Daher Standard-GC-Mechanismus DCOM sollte für alle Objekte verwendet werden, die heruntergefahren werden müssen, wenn ihre Kunden verschwinden oder sonst schlecht benehmen, wenn diese Objekte effektiv Speicherlecks auf dem Server werden würde.

Der Resolver auf dem Server-Rechner verfolgt die Pings für jedes Serverobjekt . Der Ping-Zeitraum ist 2 Minuten und derzeit ist es nicht konfigurierbar. Wenn der Resolver auf dem Server feststellt, dass ein Objekt für 6 Minuten nicht gepingt wurde, nimmt er an, dass alle Clients des Objekts nicht länger beendet haben, das Objekt zu verwenden. Der Resolver gibt dann alle externen Referenzen auf das Objekt frei. Es tut dies , indem Sie einfach den Stub des Objekts Manager (der COM-Laufzeitcode, liefert Aufrufe an jedes Objekt) Aufruf :: Release() auf der IUnknown Schnittstelle des Objekts. Zu diesem Zeitpunkt ist der Referenzzähler des Objekts Null, soweit die COM-Laufzeit betroffen ist.(Es kann noch Verweis durch lokale (same-Wohnung) Kunden gehalten werden, so dass das Objekts interne Referenzzähler auf Null nicht unbedingt gehen können an diesem Punkt .) Das Objekt kann geschlossen dann selbst nach unten.

HINWEIS: Die Garbage-Collection gilt für alle Server unabhängig davon, ob ihre Kunden sind lokal oder remote oder eine Kombination aus lokalen und entfernten. Der zugrundeliegende Ping-Mechanismus ist anders im lokalen Fall, da keine Netzwerkpakete generiert werden, aber für alle praktischen Zwecke ist das Verhalten das gleiche.