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를 관리할 또다른 방안이 필요합니다
'개발언어 > c++' 카테고리의 다른 글
LNK2005 _DllGetClassObjec,already defined in AtlTest.obj (0) | 2016.07.18 |
---|---|
error LNK2001: unresolved external symbol _main (0) | 2016.07.18 |
ATL, _com_error 클래스와 HRESULT 에러 처리,error (0) | 2016.07.18 |
VB에서 VC++ 상속 받기 혹은 추상화 하기 (0) | 2016.07.18 |
ATL License 구하기,Activex License 찾기 (0) | 2016.07.18 |