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 사이의 스코프보다 스마트 포인터 객체의 스코프가 더 크면 저런 문제가 생깁니다. 변수 스코프를 다시 확인해보세요 |
|||
'Tech & IT > 프로그래밍' 카테고리의 다른 글
[Scrap] Extended use of CStatic Class (0) | 2009.05.27 |
---|---|
CStdioFile: GetPosition, Seek 질문답변 (0) | 2009.05.22 |
COM Versioning관련해서 알아볼 것 (0) | 2009.02.18 |
Debugging Tip, Windows dll의 symbol정보 표시 (0) | 2009.02.18 |
Debugging Tools and Symbols: Getting Started (0) | 2009.02.17 |