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?