2009-03-23 5 views
0

MSXML2 :: IXMLDOMDocument2 *의 정적 인스턴스를 사용하는 클래스를 내보내는 C++ dll (x.dll)이 있습니다.정적 인스턴스 MSXML2 :: IXMLDOMDocument2 * invaild

X.dll

에서

wrapper.h

class EXPORTEDCLASS wrapper 
{ 
    wrapper(); 
    public: 
// Some accessor methods. 

    private: 
    PIMPL* pImpl; 
}; 

wrapper.cpp

class PIMPL 
{ 
public: 
    PIMPL(); 

    static MSXML2::IXMLDOMDocumentPtr m_pDomDocument; 
    static s_bInit; 

    static void initDomDocument(); 
}; 

PIMPL::PIMPL() 
{ 
    initDomDocument(); 
} 


void PIMPL::initDomDocument() 
{ 
    if(!s_bInit) 
    { 
     hr = CoCreateInstance(CLSID_DOMDocument40,NULL, CLSCTX_INPROC_SERVER, 
    IID_IXMLDOMDocument2, (void**)&m_pDomDocument); 

    m_pDomDocument->load(strFileName); 

    s_bInit = true; 
} 
} 

wrapper::wrapper() 
{ 
    pImpl = new PIMPL(); 
} 

m_pDomDocument은 어디 해제되지 않습니다. 그러나 일부 지역에서는 일부 로컬 스마트 포인터에만 할당되며 그 위치는 명시 적으로 해제되지 않습니다. 래퍼의 최초의 호출이 다른 DLL

m_pDomDocument 포인터가 생성이 시간의 DllMain에서 래퍼로 같은 모든 호출이 성공으로 제공되는 응용 프로그램에서

.

또 다른 dll의 DllMain에서 다음 호출이 발생하면 s_bInit가 true이므로이 객체를 다시 생성하지 않습니다.

하지만 이번에는 어떻게 든 m_pDomDocument가 잘못되었습니다. (그 값은 첫 번째 호출과 동일하지만 해당 vptr은 유효하지 않습니다.)

여기서 어떤 문제가 생길 수 있습니까? COM 개체 생성이를 사용하여

답변

0

시도해보십시오 문제가 해결

m_pDomDocument.CreateInstance("MSXML2.DOMDocument"); 
1

.

COM 라이브러리를 비우는 데 사용 된 CoUninitialize가 예기치 않게 호출되었습니다.

관련 문제