본문으로 바로가기

CoInitialize의 기능

category 개발언어/c++ 2016. 7. 18. 10:57

C++에서 COM 객체를 사용하기 위해서는 객체를 사용하려는

각 Thread에서 CoInitialize나 CoInitializeEx를 호출해 줘야 합니다.

또한 CoInitialize를 호출하면 COM 객체의 사용이 끝났을 때 반드시 CoUninitialize를 호출해 줘야 합니다.

CoInitialize를 n 번 호출할 경우 CoUninitialize도 n 번 호출이 되어야 한다는 의미 입니다.

CoInitialize가 S_FALSE를 리턴할 경우 S_FALSE를 리턴한 경우를 포함해서 CoUnintialize를 호출해야 합니다.

그런데 문제는 CoInitializeEx의 경우 다음과 같은 경우에 문제가 발생할 수 있습니다.

CoInitializeEx(COINIT_APARTMENTTHREADED)
CoInitializeEx(COINIT_MULTITHREADED)
CoUninitialize()
CoUninitialize()

위와 같이 호출한 경우 두번째 CoInitializeEx(COINIT_MULTITHREADED)를 호출하면

함수는 reference count를 증가시키지 않고 RPC_E_CHANGED_MODE 를 리턴합니다.

이렇게 되면 CoUninitialize의 호출이 더 많이 일어나게 되어 아직 COM 객체를 사용중인데도 불구하고 관련 연결이나 메모리들이 해제되어버리는 사태가 발생합니다.

이 문제를 해결하려면 RPC_E_CHANGED_MODE를 에러로 간주하고 reference count를 유지시키는 방향으로 코드를 작성하는 것이 좋습니다.

혹은 문제가 발생하지 않도록 reference count를 관리할 또다른 방안이 필요합니다