CoDisconnectContext 函数 (combaseapi.h)

断开代表指向当前上下文中对象的所有接口指针维护的所有代理连接。

此函数会阻止连接,直到所有对象都成功断开连接或超时过期。 只有实际管理对象的上下文应调用 CoDisconnectContext

语法

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

参数

[in] dwTimeout

之后,即使所有对象的代理连接尚未断开连接, CoDisconnectContext 也会返回该时间(以毫秒为单位)。 INFINITE 是此参数的可接受值。

返回值

此函数可以返回标准返回值E_FAIL、E_INVALIDARG和E_OUTOFMEMORY,以及以下值。

返回代码 说明
S_OK
已成功断开所有对象的代理连接。
RPC_E_TIMEOUT
并非所有代理连接都在 dwTimeout 中指定的时间内成功删除。
CO_E_NOTSUPPORTED
当前上下文无法断开连接。
CONTEXT_E_WOULD_DEADLOCK
对象试图在它驻留的上下文上调用 CoDisconnectContext 。 如果 dwTimeout 设置为 INFINITE,则会导致函数超时和死锁。

注解

CoDisconnectContext 函数用于支持在共享服务主机中卸载服务,您必须卸载服务的二进制文件,而不会影响在同一进程中运行的其他 COM 服务器。 如果控制进程生存期,并且直到进程退出才卸载,则 COM 基础结构将自动执行必要的清理,你不必调用此函数。

CoDisconnectContext 函数使服务器能够正确断开当前上下文中所有对象的所有外部客户端的连接。 默认上下文不能断开连接。 若要使用 CoDisconnectContext,必须先创建可断开连接的上下文,并为要在该上下文中断开连接的对象注册类工厂。 可以使用 IContextCallback 接口执行此操作。

如果 CoDisconnectContext 返回RPC_E_TIMEOUT,这并不表示函数未断开对象的连接,但并非所有断开连接都可以在 dwTimeout 指定的时间内完成,因为对象上的未完成调用。 完成所有对象调用后,所有对象都将断开连接。

CoDisconnectContext 返回S_OK之前,卸载承载服务的 DLL 是不安全的。 如果函数返回RPC_E_TIMEOUT,则服务可能会执行其他清理。 服务必须调用函数,直到返回S_OK,然后才能安全地卸载其 DLL。

CoDisconnectContext 函数执行以下任务:

  • 对当前上下文中的所有对象调用 CoDisconnectObject
  • 阻止,直到所有对象都已断开连接或超时已过期。
CoDisconnectContext 函数具有以下限制:
  • 不支持异步 COM 调用。
  • 必须使用 CLSCTX_LOCAL_SERVER 标志注册和启用进程内对象,否则它们不会断开连接。
  • 不支持 COM+。
  • COM 接口指针与上下文相关。 因此,在上下文中创建的任何要断开连接的接口指针只能在该上下文中使用。

示例

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);
}


要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 combaseapi.h (包括 Objbase.h)
Library Ole32.lib
DLL Ole32.dll

另请参阅

CoDisconnectObject

IContextCallback