2009-03-23 22 views
0

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は無効です)

ここで間違っているかもしれないことを誰かに教えてもらえますか?

答えて

0

はあなたのCOMオブジェクトの作成のためにこれを使用してみてください:

m_pDomDocument.CreateInstance("MSXML2.DOMDocument"); 
1

問題が解決されます。

COMライブラリを解放するために使用されたCoUninitializeが不意に呼び出されました。

関連する問題