MSXML2::IXMLDOMDocument2* の静的インスタンスを使用するクラスをエクスポートする C++ dll (x.dll) があります。
X.dll で
wrapper.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がtrueであることがわかり、このオブジェクトを再度構築しません。
しかし、今回はどういうわけか m_pDomDocument が無効です。(その値は最初の呼び出しと同じですが、その vptr は無効です)
ここで何がうまくいかないのか誰にも教えてもらえますか?