MSXML2 :: IXMLDOMDocument2 *的静态实例变为无效

时间:2009-03-23 06:02:11

标签: c++ msxml

我有一个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时,我发现loanInit是真的,所以我不再构造这个对象。

但是这次m_pDomDocument无效。 (它的值与第一次调用的值相同,但其vptr无效)

有人可以告诉我这里可能出现的问题吗?

2 个答案:

答案 0 :(得分:1)

问题已解决。

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

答案 1 :(得分:0)

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

m_pDomDocument.CreateInstance("MSXML2.DOMDocument");