msxml程序的最后一行出错

时间:2011-07-08 08:02:19

标签: c++ com msxml

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

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

  

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

comip.h _Release()方法<{1}}

这是我的代码

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();方法有什么问题?

谢谢,

1 个答案:

答案 0 :(得分:5)

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