반응형
 
[펌] 미니 ATL 프로그래밍
간단예제 만들기

출처 : http://blog.daum.net/aswip/7588370

 
[Q&A] CoInitialize, CoUninitialize, Release 관련 Scope질문답변
 XML 데이타처리와 관련하여  | VC++ 일반 2006-07-17 오후 9:05:47

 // 기동 및 처리과정


    ::CoInitialize(NULL);
    CreateDOMXML();


    CString     strPath;


    // 모듈의 패스를 취득한다..
    CGLPFileDirUtility  MessageFileDir;
    strPath = MessageFileDir.GetExeModuleDirectory();
    strPath += GLP_MESSAGEFILENAME;
    LoadXMLFile(strPath);


// 종료시


    ::CoUninitialize();


* 위에서 기동및 처리과정에서는 전혀 문제가 없습니다. 그리고 제가 원하는 XML 데이타도
잘 가져 오는데요


종료시 과정인 ::CoUninitialize() 함수만 실행했다하면


VC98/include/COMIP.H의 아래부분에서


    // The Interface.
    //
    Interface* m_pInterface;


    // Releases only if the interface is not null.
    // The interface is not set to NULL.
    //
    void _Release() throw()
    {
        if (m_pInterface != NULL) {
            m_pInterface->Release();         <---------------- 여기요
        }
    }


에서 에러라구 팍 올라옵니다.  좀 누가 아시면 좀 알려주세요
죽겠습니다.
 [답변]... 2006-07-17 오후 11:00:01
XML 이면 IXML???Ptr 류의 스마트 포인터를 쓰셨을 것 같군요.
맞죠? 그걸 혹시 멤버 변수로 하셨습니까?


그런 경우에 문제가 될 수 있는데 CoUninitialize 를 하고 나면 이 이후에
COM API 호출하느건 다 에러 떨어집니다. 그런데 아마 이걸 멤버 함수
리턴하기 전에 하셨을 것 같은데 맞죠?


그럼 나중에 클래스 인스턴스가 파괴되면서 내부적으로 Release 를 다 부르는데
이미 CoUninitialize 가 호출된 후이기 때문에 그렇게 되는겁니다.


뭐 꼭 이런 상황이 아니더라도 비슷하게 CoInitilize 와 CoUnintialize 사이의 스코프보다
스마트 포인터 객체의 스코프가 더 크면 저런 문제가 생깁니다.
변수 스코프를 다시 확인해보세요
 
   
반응형

+ Recent posts