Статический экземпляр MSXML2 :: IXMLDOMDocument2 * становится неактивным - PullRequest
0 голосов
/ 23 марта 2009

У меня есть C ++ dll (x.dll), который экспортирует класс, который использует статический экземпляр MSXML2 :: IXMLDOMDocument2 *.

In 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 нигде не выпускается. Но в некоторых местах это присваивается только некоторым локальные смарт-указатели, и они тоже явно не выпускаются.

В приложении первый вызов оболочки происходит из DllMain какой-то другой библиотеки

На этот раз создается указатель m_pDomDocument, и поэтому все вызовы обертки завершаются успешно.

Когда приходит следующий вызов, который также происходит из DllMain какого-то другого dll, я обнаруживаю, что s_bInit имеет значение true, поэтому я не создаю этот объект снова

Но на этот раз m_pDomDocument почему-то недопустим. (Его значение такое же, как и для первого вызова, но его vptr недействителен)

Кто-нибудь может мне сказать, что здесь может пойти не так?

Ответы [ 2 ]

1 голос
/ 23 марта 2009

Проблема решена.

Был несвоевременный вызов CoUninitialize, который использовал для освобождения библиотеки COM.

0 голосов
/ 23 марта 2009

Попробуйте использовать это для создания вашего COM-объекта:

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