У меня есть 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 недействительно)
Может ли кто-нибудь сказать мне, что здесь может быть неправильным?