c++ - msxml程序最后一行出错

标签 c++ com msxml

我正在使用 MSXML 4.0 来解析我的 xml。

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

Unhandled exception at 0x00417be5 in db2.exe: 0xC0000005: Access violation reading location 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(); 方法有什么问题?

谢谢,

最佳答案

调用 CoUninitialize 后,您将隐式使用 COM。这是在 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();
}

关于c++ - msxml程序最后一行出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6621618/

相关文章:

c++ - 如何在 C 中访问 SOAP header

c++ - 是否有可能有一个指针指向由奇怪的递归模板创建的基类?

c# - 如何通过 CLSID 在 C# 中实例化 COM 对象?

c++ - 如何读取 xsd :dateTime with msxml?

delphi - 如何在 Delphi 7 中使用 MSXML 6.0 创建 TXML 文档?

C++ 嵌入 lua 5.2 对 `luaL_newstate' 的 undefined reference (ubuntu 14.04,Netbeans)

c++ - std::future 什么时候执行?

c# - C#中如何枚举COM对象的成员?

c++ - 从 MFC 客户端调用远程 COM 组件?

xml - MSXML 4.0 变成了什么?