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 |
---|---|
|
Die Proxyverbindungen für alle Objekte wurden erfolgreich getrennt. |
|
Nicht alle Proxyverbindungen wurden in der in dwTimeout angegebenen Zeit erfolgreich gelöscht. |
|
Der aktuelle Kontext kann nicht getrennt werden. |
|
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.
- 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 |