我有一个 C++ dll (x.dll),它导出一个使用 MSXML2::IXMLDOMDocument2* 静态实例的类。
在 X.dll 中
包装器.h
class EXPORTEDCLASS wrapper
{
wrapper();
public:
// Some accessor methods.
private:
PIMPL* pImpl;
};
包装器.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 的 DllMain
这次创建了 m_pDomDocument 指针,因此对包装器的所有调用都成功了。
当下一个调用也恰好来自其他 dll 的 DllMain 时,我发现 s_bInit 是真的,所以我不再构造这个对象。
但这一次 m_pDomDocument 不知何故无效。(其值与第一次调用相同,但其 vptr 无效)
谁能告诉我这里可能出了什么问题?