0

我有一个 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 无效)

谁能告诉我这里可能出了什么问题?

4

2 回答 2

1

问题已解决。

有一个不合时宜的调用 CoUninitialize 用于释放 COM 库。

于 2009-03-23T12:27:43.323 回答
0

尝试使用它来创建 COM 对象:

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