共用方式為


coDisconnectContext 函式 (combaseapi.h)

中斷代表指向目前內容中物件之所有介面指標維護的所有 Proxy 連線。

此函式會封鎖連線,直到所有物件成功中斷連線或逾時到期為止。 只有實際管理對象的內容應該呼叫 CoDisconnectContext

語法

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

參數

[in] dwTimeout

CoDisconnectContext 傳回之後的毫秒時間,即使所有物件的 Proxy 連線尚未中斷連線也一樣。 INFINITE 是這個參數可接受的值。

傳回值

此函式可以傳回標準傳回值E_FAIL、E_INVALIDARG和E_OUTOFMEMORY,以及下列值。

傳回碼 描述
S_OK
已成功中斷所有物件的 Proxy 連線。
RPC_E_TIMEOUT
並非所有 Proxy 連線在 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)
程式庫 Ole32.lib
Dll Ole32.dll

另請參閱

CoDisconnectObject

IContextCallback