CoDisconnectContext 함수(combaseapi.h)
현재 컨텍스트의 개체를 가리키는 모든 인터페이스 포인터를 대신하여 유지 관리되는 모든 프록시 연결의 연결을 끊습니다.
이 함수는 모든 개체의 연결이 끊어지거나 제한 시간이 만료될 때까지 연결을 차단합니다. 개체를 실제로 관리하는 컨텍스트만 CoDisconnectContext를 호출해야 합니다.
구문
HRESULT CoDisconnectContext(
[in] DWORD dwTimeout
);
매개 변수
[in] dwTimeout
모든 개체의 프록시 연결이 끊어지지 않은 경우에도 CoDisconnectContext 가 반환되는 시간(밀리초)입니다. INFINITE는 이 매개 변수에 허용되는 값입니다.
반환 값
이 함수는 다음 값뿐만 아니라 표준 반환 값 E_FAIL, E_INVALIDARG 및 E_OUTOFMEMORY 반환할 수 있습니다.
반환 코드 | Description |
---|---|
|
모든 개체의 프록시 연결이 성공적으로 끊어졌습니다. |
|
dwTimeout에 지정된 시간에 모든 프록시 연결이 성공적으로 삭제되지는 않았습니다. |
|
현재 컨텍스트의 연결을 끊을 수 없습니다. |
|
개체가 있는 컨텍스트에서 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 를 호출합니다.
- 모든 개체의 연결이 끊어지거나 제한 시간이 만료될 때까지 차단합니다.
- 비동기 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 |