Ошибка в последней строке программы msxml - PullRequest
3 голосов
/ 08 июля 2011

Я использую MSXML 4.0 для синтаксического анализа моего xml.

Программа работает нормально, но непосредственно перед ее завершением я получаю следующее исключение

Необработанное исключение в 0x00417be5 вdb2.exe: 0xC0000005: место чтения нарушения доступа 0x00b1c740.

в comip.h в _Release() метод в строке m_pInterface->Release();

Вот мой код

#include <iostream>
#include "stdafx.h"
#include "Database.h"
#include <sstream>
#include <objbase.h>
#import <msxml4.dll>

using namespace std;


void main(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);
    MSXML2::IXMLDOMDocumentPtr pXMLDom;
    HRESULT hr= pXMLDom.CreateInstance(__uuidof(MSXML2::DOMDocument40), NULL, CLSCTX_INPROC_SERVER); //Msxml2.DOMDocument.4.0 

    if (FAILED(hr)) 
    {
      printf("Failed to instantiate an XML DOM.\n");
      //return 0;
    }

    try
    {
        pXMLDom->async = VARIANT_FALSE;
        pXMLDom->validateOnParse = VARIANT_FALSE;
        pXMLDom->resolveExternals = VARIANT_FALSE;

        if(pXMLDom->load("users.xml") == VARIANT_TRUE)
        {
            printf("XML DOM loaded from users.xml:\n%s\n", (LPCSTR)pXMLDom->xml);
        }
        else
        {
            // Failed to load xml
            printf("Failed to load DOM from stocks.xml. %s\n",
                   (LPCSTR)pXMLDom->parseError->Getreason());
        }
        ::CoUninitialize();
    }
    catch(_com_error errorObject)
    {
        printf("Exception thrown, HRESULT: 0x%08x", errorObject.Error());
    }
    catch(...)
    {
        printf("Unknown error");
    }   
}

Я не знаю, что не так с моей программой.Он просто создает исключение перед последней строкой.

Может ли кто-нибудь указать мне правильное направление?

Редактировать: Странно, я удалил ::CoUninitialize(); из своей программы и этоотлично работает.

Что не так с методом ::CoUninitialize();?

Спасибо,

1 Ответ

5 голосов
/ 08 июля 2011

Вы неявно используете COM после того, как позвонили CoUninitialize. Это делается в деструкторе MSXML2::IXMLDOMDocumentPtr, который вызывает функцию IXMLDOMDocument::Release.

CoUninitialize должен быть абсолютной последней вызванной функцией COM.

Внесите эти изменения, и это сработает. Я убедился, что CoUninitialize будет вызываться после деструктора MSXML2::IXMLDOMDocumentPtr:

void XMLDomTest()
{
    MSXML2::IXMLDOMDocumentPtr pXMLDom;
    HRESULT hr= pXMLDom.CreateInstance(__uuidof(MSXML2::DOMDocument40), NULL, CLSCTX_INPROC_SERVER); //Msxml2.DOMDocument.4.0 

    if (FAILED(hr)) 
    {
      printf("Failed to instantiate an XML DOM.\n");
      return;
    }

    try
    {
        pXMLDom->async = VARIANT_FALSE;
        pXMLDom->validateOnParse = VARIANT_FALSE;
        pXMLDom->resolveExternals = VARIANT_FALSE;

        if(pXMLDom->load("users.xml") == VARIANT_TRUE)
        {
            printf("XML DOM loaded from users.xml:\n%s\n", (LPCSTR)pXMLDom->xml);
        }
        else
        {
            // Failed to load xml
            printf("Failed to load DOM from stocks.xml. %s\n",
                   (LPCSTR)pXMLDom->parseError->Getreason());
        }
    }
    catch(_com_error errorObject)
    {
        printf("Exception thrown, HRESULT: 0x%08x", errorObject.Error());
    }
    catch(...)
    {
        printf("Unknown error");
    }   
}

void main(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);
    XMLDomTest();
    ::CoUninitialize();
}
...