CoDisconnectContext-Funktion (combaseapi.h)

Trennt alle Proxyverbindungen, die im Namen aller Schnittstellenzeiger verwaltet werden, die auf Objekte im aktuellen Kontext verweisen.

Diese Funktion blockiert Verbindungen, bis alle Objekte erfolgreich getrennt wurden oder das Timeout abläuft. Nur der Kontext, der die Objekte tatsächlich verwaltet, sollte CoDisconnectContext aufrufen.

Syntax

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

Parameter

[in] dwTimeout

Die Zeit in Millisekunden, nach der CoDisconnectContext zurückgegeben wird, auch wenn die Proxyverbindungen für alle Objekte nicht getrennt wurden. INFINITE ist ein akzeptabler Wert für diesen Parameter.

Rückgabewert

Diese Funktion kann die Standardrückgabewerte E_FAIL, E_INVALIDARG und E_OUTOFMEMORY sowie die folgenden Werte zurückgeben.

Rückgabecode BESCHREIBUNG
S_OK
Die Proxyverbindungen für alle Objekte wurden erfolgreich getrennt.
RPC_E_TIMEOUT
Nicht alle Proxyverbindungen wurden in der in dwTimeout angegebenen Zeit erfolgreich gelöscht.
CO_E_NOTSUPPORTED
Der aktuelle Kontext kann nicht getrennt werden.
CONTEXT_E_WOULD_DEADLOCK
Ein -Objekt hat versucht, CoDisconnectContext für den Kontext aufzurufen, in dem es sich befindet. Dies würde dazu führen, dass die Funktion timeout und deadlockt, wenn dwTimeout auf INFINITE festgelegt wäre.

Hinweise

Die CoDisconnectContext-Funktion wird verwendet, um das Entladen von Diensten auf Freigegebenen Diensthosts zu unterstützen, auf denen Sie die Binärdateien Ihres Diensts entladen müssen, ohne andere COM-Server zu beeinträchtigen, die im gleichen Prozess ausgeführt werden. Wenn Sie die Prozesslebensdauer steuern und erst entladen, wenn der Prozess beendet wird, führt die COM-Infrastruktur die erforderliche Bereinigung automatisch durch, und Sie müssen diese Funktion nicht aufrufen.

Mit der Funktion CoDisconnectContext kann ein Server alle externen Clients aller Objekte im aktuellen Kontext ordnungsgemäß trennen. Standardkontexte können nicht getrennt werden. Um CoDisconnectContext zu verwenden, müssen Sie zunächst einen Kontext erstellen, der getrennt werden kann, und Ihre Klassenfabriken für Objekte registrieren, von denen Sie die Verbindung innerhalb dieses Kontexts trennen möchten. Dies ist mit der IContextCallback-Schnittstelle möglich.

Wenn CoDisconnectContext RPC_E_TIMEOUT zurückgibt, bedeutet dies nicht, dass die Funktion die Objekte nicht getrennt hat, aber nicht alle Trennungen in der von dwTimeout angegebenen Zeit aufgrund ausstehender Aufrufe der Objekte abgeschlossen werden konnten. Alle Objekte werden getrennt, nachdem alle Aufrufe für sie abgeschlossen wurden.

Es ist nicht sicher, die DLL zu entladen, die den Dienst hostet, bis CoDisconnectContext S_OK zurückgibt. Wenn die Funktion RPC_E_TIMEOUT zurückgibt, kann der Dienst andere sauber ausführen. Der Dienst muss die Funktion aufrufen, bis er S_OK zurückgibt, und kann dann seine DLL sicher entladen.

Die CoDisconnectContext-Funktion führt die folgenden Aufgaben aus:

  • Ruft CoDisconnectObject für alle Objekte im aktuellen Kontext auf.
  • Blockiert, bis alle Objekte getrennt wurden oder das Timeout abgelaufen ist.
Die CoDisconnectContext-Funktion hat die folgenden Einschränkungen:
  • Asynchrone COM-Aufrufe werden nicht unterstützt.
  • Prozessinterne Objekte müssen mit dem flag CLSCTX_LOCAL_SERVER registriert und aktiviert werden, sonst werden sie nicht getrennt.
  • COM+ wird nicht unterstützt.
  • COM-Schnittstellenzeiger sind kontextabhängig. Daher kann jeder Schnittstellenzeiger, der im zu trennenden Kontext erstellt wurde, nur innerhalb dieses Kontexts verwendet werden.

Beispiele

IContextCallback *icc;
hr = CoCreateInstance(CLSID_ContextSwitcher, NULL, CLSCTX_INPROC_SERVER, IID_IContextCallback, (void**)&icc);

icc->ContextCallback(EnterCallback, NULL, IID_IContextCallback, 5, NULL);

HRESULT __stdcall EnterCallback(ComCallData *pv)
{ 
    return CoRegisterClassObject(...);
}

/* All objects created by the class factories registered in the callback will be put into the newly created context.
To disconnect, re-enter the context, revoke the class factories, and call CoDisconnectContext. */

icc->ContextCallback(DisconnectCallback, NULL, IID_IContextCallback, 5, NULL);

HRESULT __stdcall DisconnectCallback(ComCallData *pv)
{
    CoRevokeClassObject(...);
    return CoDisconnectContext(timeout);
}


Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile combaseapi.h (include Objbase.h)
Bibliothek Ole32.lib
DLL Ole32.dll

Weitere Informationen

CoDisconnectObject

IContextCallback