Tech & IT/프로그래밍

COM/ATL 관련 tip

해피콧 2009. 4. 27. 13:17
'); }
'); }

[펌] 미니 ATL 프로그래밍
간단예제 만들기
출처 : http://blog.daum.net/aswip/7588370

[Q&A] CoInitialize, CoUninitialize, Release 관련 Scope질문답변
 XML 데이타처리와 관련하여  | VC++ 일반 2006-07-17 오후 9:05:47
장현철 (hcchang)  장현철님께 메시지 보내기장현철님을 내 주소록에 추가합니다.장현철님의 개인게시판 가기 번호: 590188   / 평점:  (-)  / 읽음:27

 // 기동 및 처리과정

 

    ::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
이기탁 (snaiper)  이기탁님께 메시지 보내기이기탁님을 내 주소록에 추가합니다.이기탁님의 개인게시판 가기 번호: 590201   / 평점:  (-)  

XML 이면 IXML???Ptr 류의 스마트 포인터를 쓰셨을 것 같군요.

맞죠? 그걸 혹시 멤버 변수로 하셨습니까?

 

그런 경우에 문제가 될 수 있는데 CoUninitialize 를 하고 나면 이 이후에

COM API 호출하느건 다 에러 떨어집니다. 그런데 아마 이걸 멤버 함수

리턴하기 전에 하셨을 것 같은데 맞죠?

 

그럼 나중에 클래스 인스턴스가 파괴되면서 내부적으로 Release 를 다 부르는데

이미 CoUninitialize 가 호출된 후이기 때문에 그렇게 되는겁니다.

 

뭐 꼭 이런 상황이 아니더라도 비슷하게 CoInitilize 와 CoUnintialize 사이의 스코프보다

스마트 포인터 객체의 스코프가 더 크면 저런 문제가 생깁니다.

변수 스코프를 다시 확인해보세요