Función CoDisconnectContext (combaseapi.h)
Desconecta todas las conexiones de proxy que se mantienen en nombre de todos los punteros de interfaz que apuntan a objetos en el contexto actual.
Esta función bloquea las conexiones hasta que todos los objetos se desconectan correctamente o expira el tiempo de espera. Solo el contexto que administra realmente los objetos debe llamar a CoDisconnectContext.
Sintaxis
HRESULT CoDisconnectContext(
[in] DWORD dwTimeout
);
Parámetros
[in] dwTimeout
Tiempo en milisegundos después del cual CoDisconnectContext devuelve incluso si no se han desconectado las conexiones de proxy para todos los objetos. INFINITE es un valor aceptable para este parámetro.
Valor devuelto
Esta función puede devolver los valores devueltos estándar E_FAIL, E_INVALIDARG y E_OUTOFMEMORY, así como los valores siguientes.
Código devuelto | Descripción |
---|---|
|
Las conexiones de proxy para todos los objetos se desconectaron correctamente. |
|
No todas las conexiones de proxy se eliminaron correctamente en el tiempo especificado en dwTimeout. |
|
No se puede desconectar el contexto actual. |
|
Un objeto intentó llamar a CoDisconnectContext en el contexto en el que reside. Esto provocaría que la función agote el tiempo de espera y el interbloqueo si dwTimeout se estableciera en INFINITE. |
Comentarios
La función CoDisconnectContext se usa para admitir la descarga de servicios en hosts de servicios compartidos donde debe descargar los archivos binarios del servicio sin afectar a otros servidores COM que se ejecutan en el mismo proceso. Si controla la duración del proceso y no se descarga hasta que se cierra el proceso, la infraestructura COM realizará la limpieza necesaria automáticamente y no tiene que llamar a esta función.
La función CoDisconnectContext permite que un servidor desconecte correctamente todos los clientes externos de todos los objetos del contexto actual. Los contextos predeterminados no se pueden desconectar. Para usar CoDisconnectContext, primero debe crear un contexto que se pueda desconectar y registrar los generadores de clases para los objetos desde los que desea desconectar dentro de ese contexto. Puede hacerlo con la interfaz IContextCallback .
Si CoDisconnectContext devuelve RPC_E_TIMEOUT, esto no indica que la función no desconectó los objetos, pero que no todas las desconexiones se podrían completar en el tiempo especificado por dwTimeout debido a llamadas pendientes en los objetos. Todos los objetos se desconectarán después de que se hayan completado todas las llamadas en ellos.
No es seguro descargar el archivo DLL que hospeda el servicio hasta que CoDisconnectContext devuelva S_OK. Si la función devuelve RPC_E_TIMEOUT, el servicio puede realizar otra limpieza. El servicio debe llamar a la función hasta que devuelva S_OK y, a continuación, puede descargar su DLL de forma segura.
La función CoDisconnectContext realiza las siguientes tareas:
- Llama a CoDisconnectObject en todos los objetos del contexto actual.
- Bloquea hasta que todos los objetos se hayan desconectado o haya expirado el tiempo de espera.
- No se admiten llamadas COM asincrónicas.
- Los objetos en proceso deben estar registrados y habilitados con la marca CLSCTX_LOCAL_SERVER, o no se desconectarán.
- NO se admite COM+.
- Los punteros de interfaz COM distinguen el contexto. Por lo tanto, cualquier puntero de interfaz creado en el contexto que se va a desconectar solo se puede usar dentro de ese contexto.
Ejemplos
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);
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows Vista [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | combaseapi.h (incluya Objbase.h) |
Library | Ole32.lib |
Archivo DLL | Ole32.dll |