2009-03-23 5 views
0

Ich habe eine C++ - DLL (x.dll), die eine Klasse exportiert, die eine statische Instanz von MSXML2 :: IXMLDOMDocument2 * verwendet.Statische Instanz von MSXML2 :: IXMLDOMDocument2 * wird inveild

In 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 ist nicht überall veröffentlicht worden. Aber an einigen Stellen ist es nur einigen lokalen Smart-Pointern zugewiesen, und auch diese werden nicht explizit freigegeben.

der erste Aufruf der Wrapper von DllMain eines anderen DLL in der Anwendung

Diesmal m_pDomDocument Zeiger alle erstellt und als solche die Anrufe an den Wrapper Erfolg kommt.

Wenn der nächste Aufruf kommt, der zufällig auch von DllMain einer anderen DLL ist, finde ich, dass s_bInit ist wahr, so dass ich dieses Objekt nicht wieder konstruieren.

Aber dieses Mal ist irgendwie m_pDomDocument ungültig. (Sein Wert ist der selbe wie für den ersten Anruf, aber sein vptr ist ungültig)

Kann mir jemand sagen, was hier schief gehen könnte?

Antwort

0

Versuchen Sie, diese für die COM-Objekterstellung mit:

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

Das Problem behoben ist.

Es gab einen unzeitigen Aufruf von CoUninitialize, mit dem die COM-Bibliothek freigegeben wurde.

Verwandte Themen