MSXML2 :: IXMLDOMDocument2 *の静的インスタンスを使用するクラスをエクスポートするC++ dll(x.dll)があります。MSXML2 :: IXMLDOMDocument2 *の静的インスタンスが呼び出される
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はどこにも解放されません。しかし、いくつかの場所では、一部の ローカルスマートポインタにのみ割り当てられており、明示的に解放されていません。
は、アプリケーションでは、ラッパーの最初の呼び出しは、いくつかの他のdll
のDllMain内からこの時間が来るm_pDomDocumentポインタが作成され、のようなラッパーへのすべての呼び出しが成功します。
他のDLLのDllMainから次の呼び出しがあった場合、s_bInitがtrueであるため、このオブジェクトを再度作成しないでください。
しかし、今回は何とかm_pDomDocumentが無効です。 (その値は最初の呼び出しと同じですが、そのvptrは無効です)
ここで間違っているかもしれないことを誰かに教えてもらえますか?