我正在使用 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/