MSXML6 中的第一次机会异常
Posted
技术标签:
【中文标题】MSXML6 中的第一次机会异常【英文标题】:First chance exception in MSXML6 【发布时间】:2013-11-06 13:01:21 【问题描述】:我正在根据 XSD 模式验证 XML 文件,就像它们在 MSXML 文档 example 中所做的那样。我有以下代码:
XMLSchemaValidation updateInfoSchema;
updateInfoSchema.DoInitialization(L"schema.xsd");
HRESULT hr = CoInitialize(NULL);
if(SUCCEEDED(hr))
try
_bstr_t bstrOutput = updateInfoSchema.validateFile(L"valid.xml");
catch(_com_error &e)
updateInfoSchema.dump_com_error(e);
CoUninitialize();
// Macro that calls a COM method returning HRESULT value.
#define CHK_HR(stmt) do hr=(stmt); if (FAILED(hr)) goto CleanUp; while(0)
_bstr_t XMLSchemaValidation::validateFile(_bstr_t bstrFile)
// Declare and initialize variables
MSXML2::IXMLDOMSchemaCollectionPtr pXS;
MSXML2::IXMLDOMDocument2Ptr pXD;
MSXML2::IXMLDOMParseErrorPtr pErr;
_bstr_t bstrResult = L"";
HRESULT hr = S_OK;
// Create a schema cache and add xsd schema to it.
CHK_HR(pXS.CreateInstance(__uuidof(MSXML2::XMLSchemaCache60), NULL, CLSCTX_INPROC_SERVER));
CHK_HR(pXS->add(L"", (LPCSTR)(SchemaFileName.GetString())));
// Create a DOMDocument and set its properties.
CHK_HR(pXD.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER));
// Assign the schema cache to the DOMDocument's schemas collection.
pXD->schemas = pXS.GetInterfacePtr();
// Load bstrFile into the DOM document.
pXD->async = VARIANT_FALSE;
pXD->validateOnParse = VARIANT_TRUE;
pXD->resolveExternals = VARIANT_TRUE;
if(pXD->load(bstrFile) != VARIANT_TRUE)
pErr = pXD->parseError;
bstrResult = _bstr_t(L"Validation failed on ") + bstrFile +
_bstr_t(L"\n=====================") +
_bstr_t(L"\nReason: ") + _bstr_t(pErr->Getreason()) +
_bstr_t(L"\nSource: ") + _bstr_t(pErr->GetsrcText()) +
_bstr_t(L"\nLine: ") + _bstr_t(pErr->Getline()) +
_bstr_t(L"\n");
else
bstrResult = _bstr_t(L"Validation succeeded for ") + bstrFile +
_bstr_t(L"\n======================\n") +
_bstr_t(pXD->xml) + _bstr_t(L"\n");
CleanUp:
return bstrResult;
XMLSchemaValidation::DoInitialization(CString XSDFileName)
将 XSD 架构文件名获取到 CString XMLSchemaValidation::SchemaFileName
。
然后代码遵循 MSXML 示例中的代码,但我明白了
First-chance exception at 0x76f9c41f (KernelBase.dll) in CSW.exe: Microsoft C++ exception: _com_error at memory location 0x04a7f014..
当代码到达CHK_HR(pXS->add(L"", (LPCSTR)(SchemaFileName.GetString())));
。 hr
有 -2146697210。
谁能告诉我为什么会这样?
【问题讨论】:
CHK_HR
的代码是什么?如果它类似于_com_util::CheckError
,那么这就是引发异常的地方。您总是可以...捕获异常并查看 HRESULT
是什么。
我添加了CHK_HR
宏的代码,hr
的值在异常点。
【参考方案1】:
MSXML 正在抛出 HRESULT
OBJECT_NOT_FOUND
(0x800C0006),因为您使用的 xml 未指定字符集,如 this question 中所述。或者 MSXML 找不到文件。
【讨论】:
我添加了 encoding="UTF-8" 但同样的事情发生了。 这些文件实际上是 UTF-8 吗?默认情况下,Windows 上的大多数文本编辑器都保存在 CP-1252 中 我用 notepad++ 将它们转换为 UTF-8,所以它们应该是这样的 @GreatDane 是同一个 HRESULT 吗? (请使用 HEX 表示 HRESULTS)以上是关于MSXML6 中的第一次机会异常的主要内容,如果未能解决你的问题,请参考以下文章