C++ MSXML6中的首次机会异常
我正在根据XSD模式验证XML文件,正如它们在MSXML文档中所做的那样。我有以下代码:C++ MSXML6中的首次机会异常,c++,visual-studio-2010,xsd,msxml6,first-chance-exception,C++,Visual Studio 2010,Xsd,Msxml6,First Chance Exception,我正在根据XSD模式验证XML文件,正如它们在MSXML文档中所做的那样。我有以下代码: XMLSchemaValidation updateInfoSchema; updateInfoSchema.DoInitialization(L"schema.xsd"); HRESULT hr = CoInitialize(NULL); if(SUCCEEDED(hr)) { try { _bstr_t bstrOutput = updateInfoSchema.val
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架构文件名放入CStringXMLSchemaValidation::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())代码><代码>人力资源拥有-2146697210
有人能告诉我为什么会发生这种情况吗?MSXML正在抛出未找到的
HRESULT
对象(0x800C0006),因为您使用的xml没有指定字符集,如中所述。或者MSXML找不到该文件。MSXML正在抛出未找到的HRESULT
对象(0x800C0006),因为您使用的xml未指定字符集,如中所述。或者MSXML找不到该文件。CHK_HR的代码是什么?如果它类似于\u com\u util::CheckError
,那么这就是引发异常的原因。你可以一直。。。捕获异常并查看HRESULT
是什么。我添加了CHK_HR
宏的代码和HR
值在异常点。CHK_HR
的代码是什么?如果它类似于\u com\u util::CheckError
,那么这就是引发异常的原因。你可以一直。。。捕获异常并查看HRESULT
是什么。我为CHK_HR
宏添加了代码,并且HR
的值在异常点。我添加了encoding=“UTF-8”,但同样的情况也会发生。这些文件实际上是UTF-8吗?默认情况下,windows上的大多数文本编辑器都保存在CP-1252I中,我使用notepad++将它们转换为UTF-8,所以它们应该这样做be@GreatDane是同一个HRESULT吗?(请使用十六进制表示HRESULT)我添加了encoding=“UTF-8”,但同样的情况也发生了。这些文件实际上是UTF-8吗?默认情况下,windows上的大多数文本编辑器都保存在CP-1252I中,我使用notepad++将它们转换为UTF-8,所以它们应该这样做be@GreatDane是同一个HRESULT吗?(请使用十六进制表示HRESULT)