次の方法で共有


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