2009-03-23 2 views
0

У меня есть dll (x.dll) C++, который экспортирует класс, который использует статический экземпляр MSXML2 :: IXMLDOMDocument2 *.Статический экземпляр 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 не выделяется в любом месте. Но в некоторых местах он присваивается только некоторым локальным смарт-указателям , и они тоже явно не выпущены.

В заявлении первый вызов к обертке приходит из DllMain некоторых других DLL

На этот раз создается указатель m_pDomDocument и как таковой все вызовы к обертке успеха.

Когда приходит следующий вызов, который также происходит из DllMain какой-либо другой dll, я обнаружил, что s_bInit является true, поэтому я не создаю этот объект еще раз.

Но на этот раз как-то m_pDomDocument недействителен. (Его значение такое же, как для первого вызова, но его vptr недействительно)

Может ли кто-нибудь сказать мне, что здесь может быть неправильным?

ответ

0

Попробуйте использовать это для создания COM-объекта:

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

Проблема решена.

Был несвоевременный вызов CoUninitialize, который использовался для освобождения библиотеки COM.

Смежные вопросы