CoDisconnectContext 함수(combaseapi.h)

현재 컨텍스트의 개체를 가리키는 모든 인터페이스 포인터를 대신하여 유지 관리되는 모든 프록시 연결의 연결을 끊습니다.

이 함수는 모든 개체의 연결이 끊어지거나 제한 시간이 만료될 때까지 연결을 차단합니다. 개체를 실제로 관리하는 컨텍스트만 CoDisconnectContext를 호출해야 합니다.

구문

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

매개 변수

[in] dwTimeout

모든 개체의 프록시 연결이 끊어지지 않은 경우에도 CoDisconnectContext 가 반환되는 시간(밀리초)입니다. INFINITE는 이 매개 변수에 허용되는 값입니다.

반환 값

이 함수는 다음 값뿐만 아니라 표준 반환 값 E_FAIL, E_INVALIDARG 및 E_OUTOFMEMORY 반환할 수 있습니다.

반환 코드 Description
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 호출은 지원되지 않습니다.
  • in-process 개체는 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