0

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

ここで何がうまくいかないのか誰にも教えてもらえますか?

4

2 に答える 2

1

問題は解決しました。

COM ライブラリを解放するために使用される CoUninitialize への早すぎる呼び出しがありました。

于 2009-03-23T12:27:43.323 に答える
0

COM オブジェクトの作成にこれを使用してみてください。

m_pDomDocument.CreateInstance("MSXML2.DOMDocument");
于 2009-03-23T06:15:19.643 に答える