C++ msxml程序的最后一行出错

C++ msxml程序的最后一行出错,c++,com,msxml,C++,Com,Msxml,我正在使用MSXML4.0解析我的xml 该程序运行良好,但就在程序终止之前,我得到以下异常 中0x00417be5处未处理的异常 db2.exe:0xC0000005:访问冲突 读取位置0x00b1c740 在comip.hat\u Release()第m\u pInterface->Release()行的方法 这是我的密码 #include <iostream> #include "stdafx.h" #include "Database.h" #include <sstr

我正在使用MSXML4.0解析我的xml

该程序运行良好,但就在程序终止之前,我得到以下异常

中0x00417be5处未处理的异常 db2.exe:0xC0000005:访问冲突 读取位置0x00b1c740

comip.h
at
\u Release()
m\u 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");
    }   
}
#包括
#包括“stdafx.h”
#包括“Database.h”
#包括
#包括
#进口
使用名称空间std;
void main(int argc,_TCHAR*argv[])
{
::协同初始化(空);
MSXML2::IXMLDOMDocumentPtr pXMLDom;
HRESULT hr=pXMLDom.CreateInstance(uuuidof(MSXML2::DOMDocument40),NULL,CLSCTX_INPROC_SERVER);//MSXML2.DOMDocument.4.0
如果(失败(小时))
{
printf(“未能实例化XML DOM。\n”);
//返回0;
}
尝试
{
pXMLDom->async=VARIANT\u FALSE;
pXMLDom->validateOnParse=VARIANT\u FALSE;
pXMLDom->resolveExternals=VARIANT\u FALSE;
if(pXMLDom->load(“users.xml”)==VARIANT\u TRUE)
{
printf(“从users.XML:\n%s\n加载的XML DOM”,(LPCSTR)pXMLDom->XML);
}
其他的
{
//无法加载xml
printf(“未能从stocks.xml加载DOM。%s\n”,
(LPCSTR)pXMLDom->parseError->Getreason();
}
::coninitialize();
}
捕获(_com_error error object)
{
printf(“抛出异常,HRESULT:0x%08x”,errorObject.Error());
}
捕获(…)
{
printf(“未知错误”);
}   
}
我不知道我的程序出了什么问题。它只是在最后一行之前抛出一个异常

有人能给我指出一个正确的方向吗

编辑:奇怪的我删除了
::coninitialize()从我的程序,它工作良好

有什么问题::coninitialize()方法


谢谢,

您在调用
coninitialize
后隐式使用COM。这是在
MSXML2::IXMLDOMDocumentPtr
的析构函数中完成的,它调用函数
IXMLDOMDocument::Release

coninitialize
必须是调用过的最后一个COM函数

做出这些改变,它就会起作用。我已确保在
MSXML2::IXMLDOMDocumentPtr
的析构函数之后调用
CoUninitialize

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();
}

这很可能是内存错误。调试它,您应该会看到它。为什么你不通过引用来捕获异常而不是复制?@ DubCuffter我是C++新手,所以我不知道如何通过引用来捕获异常,你能给我举个例子吗?@ DimbCuffter我更新了我的问题。请看一看。使用catch(\u com\u error&errorObject)。供参考@DumbCoder非常感谢您的参考。