int do_CheckXML(lua_State* L) { CString strXml = luaL_checkstring(L,1); HRESULT hr; IXMLDOMDocument * pXMLDoc; //... hr = CoInitialize(NULL); // Check the return value, hr... hr = CoCreateInstance(CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pXMLDoc); // Check the return value, hr... VARIANT_BOOL bSuccessful; pXMLDoc->loadXML(strXml.AllocSysString(),&bSuccessful); int irez = 0; if(!bSuccessful) { IXMLDOMParseError *pIParseError = NULL; pXMLDoc->get_parseError(&pIParseError); long lineNum; pIParseError->get_line(&lineNum); long linePos; pIParseError->get_linepos(&linePos); BSTR reason; pIParseError->get_reason(&reason); lua_pushinteger(L, lineNum); lua_pushinteger(L, linePos); lua_pushstring(L, CString(reason)); pIParseError->Release(); pIParseError = NULL; irez = 3; } pXMLDoc->Release(); return irez; }
HRESULT CIhvProfileBase::LoadXml ( IN BSTR bstrProfileData ) { HRESULT hr = S_OK; IXMLDOMDocument* pDOMDoc = NULL; IXMLDOMElement* pDocElem = NULL; BSTR bstrIhvProfile = NULL; VARIANT_BOOL vfSuccess; if ( !bstrProfileData ) { hr = GetDefaultXml( &bstrIhvProfile ); BAIL_ON_FAILURE( hr ); } else { bstrIhvProfile = bstrProfileData; } if ( m_pRootNode ) { hr = E_UNEXPECTED; BAIL_ON_FAILURE( hr ); } hr = CoCreateInstance ( CLSID_DOMDocument, NULL, CLSCTX_ALL, IID_IXMLDOMDocument, (LPVOID *) &pDOMDoc ); BAIL_ON_FAILURE( hr ); hr = pDOMDoc->loadXML ( bstrIhvProfile, &vfSuccess ); BAIL_ON_FAILURE( hr ); if ( VARIANT_TRUE != vfSuccess ) { hr = E_UNEXPECTED; BAIL_ON_FAILURE( hr ); } hr = pDOMDoc->get_documentElement ( &pDocElem ); BAIL_ON_FAILURE( hr ); // Caching the pointer to the document element // in a member variable. m_pRootNode = pDocElem; pDocElem = NULL; error: if ( !bstrProfileData ) { SYS_FREE_STRING( bstrIhvProfile ); } RELEASE_INTERFACE( pDOMDoc ); RELEASE_INTERFACE( pDocElem ); return hr; }
STDMETHODIMP CStrokeRecognition::put_RecognitionParam(BSTR newVal) { double Segment_Error_Threshold; double Arc_Error_Threshold; double Arc_Min_Length; double Arc_Min_Curve; double Stroke_Min_Length; double Min_Turning_Angle; double Segmentation_Penalty; VARIANT value; BSTR nodeName; long n; IXMLDOMDocument* pDoc; IXMLDOMNodeList* pNodeList; IXMLDOMNode* pNode; IXMLDOMNode* pParamNode; IXMLDOMNode* pAttrNode; IXMLDOMNamedNodeMap* pNodeMap; VARIANT_BOOL bLoaded; GetFittingParam(Segment_Error_Threshold, Arc_Error_Threshold, Arc_Min_Length, Arc_Min_Curve, Stroke_Min_Length, Min_Turning_Angle, Segmentation_Penalty); if (SUCCEEDED(CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (LPVOID*)&pDoc))) { pDoc->put_async(VARIANT_FALSE); pDoc->loadXML(newVal, &bLoaded); if (bLoaded == VARIANT_TRUE) { if (SUCCEEDED(pDoc->get_childNodes(&pNodeList))) { pParamNode = NULL; pNodeList->get_length(&n); for (int i = 0; i < n; i++) { if (SUCCEEDED(pNodeList->get_item(i, &pNode))) { nodeName = NULL; if (SUCCEEDED(pNode->get_nodeName(&nodeName))) { if (CComBSTR(nodeName) == L"param") { pParamNode = pNode; pParamNode->AddRef(); break; } SysFreeString(nodeName); } pNode->Release(); } } pNodeList->Release(); if (pParamNode != NULL) { if (SUCCEEDED(pParamNode->get_attributes(&pNodeMap))) { if (SUCCEEDED(pNodeMap->getNamedItem(L"Segment_Error_Threshold", &pAttrNode))) { pAttrNode->get_nodeValue(&value); Segment_Error_Threshold = _wtof(value.bstrVal); pAttrNode->Release(); } if (SUCCEEDED(pNodeMap->getNamedItem(L"Arc_Error_Threshold", &pAttrNode))) { pAttrNode->get_nodeValue(&value); Arc_Error_Threshold = _wtof(value.bstrVal); pAttrNode->Release(); } if (SUCCEEDED(pNodeMap->getNamedItem(L"Arc_Min_Length", &pAttrNode))) { pAttrNode->get_nodeValue(&value); Arc_Min_Length = _wtof(value.bstrVal); pAttrNode->Release(); } if (SUCCEEDED(pNodeMap->getNamedItem(L"Arc_Min_Curve", &pAttrNode))) { pAttrNode->get_nodeValue(&value); Arc_Min_Curve = _wtof(value.bstrVal); pAttrNode->Release(); } if (SUCCEEDED(pNodeMap->getNamedItem(L"Stroke_Min_Length", &pAttrNode))) { pAttrNode->get_nodeValue(&value); Stroke_Min_Length = _wtof(value.bstrVal); pAttrNode->Release(); } if (SUCCEEDED(pNodeMap->getNamedItem(L"Min_Turning_Angle", &pAttrNode))) { pAttrNode->get_nodeValue(&value); Min_Turning_Angle = _wtof(value.bstrVal); pAttrNode->Release(); } if (SUCCEEDED(pNodeMap->getNamedItem(L"Segmentation_Penalty", &pAttrNode))) { pAttrNode->get_nodeValue(&value); Segmentation_Penalty = _wtof(value.bstrVal); pAttrNode->Release(); } pNodeMap->Release(); } pParamNode->Release(); } } } pDoc->Release(); } SetFittingParam(Segment_Error_Threshold, Arc_Error_Threshold, Arc_Min_Length, Arc_Min_Curve, Stroke_Min_Length, Min_Turning_Angle, Segmentation_Penalty); return S_OK; }
void CStrokeRecognition::DecodePointFromXML(std::vector<POINT> &rgPoints, BSTR strXML) { IXMLDOMDocument* pDoc; IXMLDOMNodeList* pNodeList; IXMLDOMNode* pNode; IXMLDOMNode* pInputNode; IXMLDOMNode* pAttrNode; IXMLDOMNamedNodeMap* pNodeMap; VARIANT_BOOL bLoaded; VARIANT value; BSTR nodeName; POINT pt; long n; if (SUCCEEDED(CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (LPVOID*)&pDoc))) { pDoc->put_async(VARIANT_FALSE); pDoc->loadXML(strXML, &bLoaded); if (bLoaded == VARIANT_TRUE) { if (SUCCEEDED(pDoc->get_childNodes(&pNodeList))) { pInputNode = NULL; pNodeList->get_length(&n); for (int i = 0; i < n; i++) { if (SUCCEEDED(pNodeList->get_item(i, &pNode))) { nodeName = NULL; if (SUCCEEDED(pNode->get_nodeName(&nodeName))) { if (CComBSTR(nodeName) == L"input") { pInputNode = pNode; pInputNode->AddRef(); break; } SysFreeString(nodeName); } pNode->Release(); } } pNodeList->Release(); if (pInputNode != NULL) { if (SUCCEEDED(pInputNode->get_childNodes(&pNodeList))) { pNodeList->get_length(&n); for (int i = 0; i < n; i++) { if (SUCCEEDED(pNodeList->get_item(i, &pNode))) { pt.x = 0; pt.y = 0; if (SUCCEEDED(pNode->get_attributes(&pNodeMap))) { if (SUCCEEDED(pNodeMap->getNamedItem(L"x", &pAttrNode))) { pAttrNode->get_nodeValue(&value); pt.x = _wtoi(value.bstrVal); pAttrNode->Release(); } if (SUCCEEDED(pNodeMap->getNamedItem(L"y", &pAttrNode))) { pAttrNode->get_nodeValue(&value); pt.y = _wtoi(value.bstrVal); pAttrNode->Release(); } pNodeMap->Release(); } rgPoints.push_back(pt); pNode->Release(); } } pNodeList->Release(); } pInputNode->Release(); } } } pDoc->Release(); } }
LRESULT CAddVideoHtmlDlg::OnLoadCatalog(WPARAM wParam, LPARAM lParam) { if(wParam == NULL) { MessageBox(TEXT("获取视频分类数据失败,请检查您的网络情况。"), TEXT("错误"), MB_OK|MB_ICONERROR); return 0; } try { TSTLSTRING strCatalogHtml; int iSelectedIndex = -1; IXMLDOMDocument* pDOM = NULL; HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pDOM); if(hr != S_OK) { throw Exception(TEXT("解析视频分类数据失败。")); } VARIANT_BOOL loaded = VARIANT_FALSE; hr = pDOM->loadXML(CComBSTR((LPCOLESTR)wParam), &loaded); if(hr != S_OK || loaded == VARIANT_FALSE) { pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNodeList* pNodeList = NULL; hr = pDOM->get_childNodes(&pNodeList); if(hr != S_OK) { pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNode* pRoot = NULL; hr = pNodeList->get_item(1, &pRoot); if(hr != S_OK) { pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNodeList* pRootChildren = NULL; hr = pRoot->get_childNodes(&pRootChildren); if(hr != S_OK) { pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNode* pResultNote = NULL; hr = pRootChildren->get_item(0, &pResultNote); if(hr != S_OK) { pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNodeList* pResultChildren = NULL; hr = pResultNote->get_childNodes(&pResultChildren); if(hr != S_OK) { pResultNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNode* pResultStatusNote = NULL; hr = pRootChildren->get_item(0, &pResultStatusNote); if(hr != S_OK) { pResultChildren->Release(); pResultNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } CComBSTR bstrResultStatus; hr = pResultStatusNote->get_text(&bstrResultStatus); if(hr != S_OK) { pResultStatusNote->Release(); pResultChildren->Release(); pResultNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } pResultStatusNote->Release(); if(bstrResultStatus != TEXT("o")) { IXMLDOMNode* pResultMessageNote = NULL; hr = pRootChildren->get_item(1, &pResultMessageNote); if(hr != S_OK) { pResultChildren->Release(); pResultNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } CComBSTR bstrResultMessage; hr = pResultMessageNote->get_text(&bstrResultMessage); if(hr != S_OK) { pResultMessageNote->Release(); pResultChildren->Release(); pResultNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } pResultMessageNote->Release(); pResultChildren->Release(); pResultNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(bstrResultMessage.m_str); } pResultChildren->Release(); pResultNote->Release(); IXMLDOMNode* pItemNote = NULL; hr = pRootChildren->get_item(1, &pItemNote); if(hr != S_OK) { pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNodeList* pItemChildren = NULL; hr = pItemNote->get_childNodes(&pItemChildren); if(hr != S_OK) { pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } long ItemCount = 0; pItemChildren->get_length(&ItemCount); if(hr != S_OK) { pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } for(int i=0; i<ItemCount; ++i) { IXMLDOMNode* pCatalogItemNote = NULL; hr = pItemChildren->get_item(i, &pCatalogItemNote); if(hr != S_OK) { pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNodeList* pCatalogItemChildren = NULL; hr = pCatalogItemNote->get_childNodes(&pCatalogItemChildren); if(hr != S_OK) { pCatalogItemNote->Release(); pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } IXMLDOMNode* pCatalogIdNote = NULL; hr = pCatalogItemChildren->get_item(0, &pCatalogIdNote); if(hr != S_OK) { pCatalogItemChildren->Release(); pCatalogItemNote->Release(); pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } CComBSTR bstrCatalogId; hr = pCatalogIdNote->get_text(&bstrCatalogId); if(hr != S_OK) { pCatalogIdNote->Release(); pCatalogItemChildren->Release(); pCatalogItemNote->Release(); pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } pCatalogIdNote->Release(); IXMLDOMNode* pCatalogNameNote = NULL; hr = pCatalogItemChildren->get_item(1, &pCatalogNameNote); if(hr != S_OK) { pCatalogItemChildren->Release(); pCatalogItemNote->Release(); pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } CComBSTR bstrCatalogName; hr = pCatalogNameNote->get_text(&bstrCatalogName); if(hr != S_OK) { pCatalogNameNote->Release(); pCatalogItemChildren->Release(); pCatalogItemNote->Release(); pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); throw Exception(TEXT("解析视频分类数据失败。")); } pCatalogNameNote->Release(); pCatalogItemChildren->Release(); pCatalogItemNote->Release(); TSTLSTRING strCurrID = TSTLSTRING(COLE2T(bstrCatalogId)); TSTLSTRING strLastCatalog = ConfigureManager::GetInstance().GetLastCatalog(); TSTLSTRING strCurrName = TSTLSTRING(COLE2T(bstrCatalogName)); bool IsSelected = ((strLastCatalog.empty() && strCurrName == TEXT("其他")) || (!strLastCatalog.empty() && strLastCatalog.compare(strCurrID) == 0)); strCatalogHtml.append(TEXT("<div class=\"ComboxListItem\" onmouseover=\"this.className='ComboxListItemSelected';\" onclick=\"OnCatalogComboxClick();\" onmouseout=\"this.className='ComboxListItem';\" Value=\"")); strCatalogHtml.append(strCurrID); strCatalogHtml.append(TEXT("\">")); strCatalogHtml.append(strCurrName); strCatalogHtml.append(TEXT("</div>")); if(IsSelected) iSelectedIndex = i; } pItemChildren->Release(); pItemNote->Release(); pRootChildren->Release(); pRoot->Release(); pNodeList->Release(); pDOM->Release(); DISPPARAMS dp; memset(&dp, 0, sizeof(DISPPARAMS)); dp.cArgs = 2; dp.cNamedArgs = 0; VARIANTARG arg[2]; memset(arg, 0, sizeof(VARIANTARG) * 2); dp.rgvarg = arg; CComBSTR bstr(strCatalogHtml.c_str()); arg[0].vt = VT_BSTR; bstr.CopyTo(&arg[0].bstrVal); arg[1].vt = VT_INT; arg[1].intVal = iSelectedIndex; m_lpCatalogInvoke->Invoke( 0, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, NULL, NULL, NULL); } catch(Exception& error) { MessageBox(error.GetMessage().c_str(), TEXT("错误"), MB_OK|MB_ICONERROR); } return 0; }
/////////////////////////////////////////////////////////////// // 功能: XML 文档文本转换成扫描参数结构 // 参数: sXMLDocText [in] XML文档的文本 // sp [out] 扫描参数结构 // 返回: true - 成功, false - 失败 bool ScanParamXML::XMLToScanParam( const string &sXMLDocText, ScanParameter &sp ) { try { IXMLDOMDocument *pXmlDoc = NULL; IXMLDOMNode *pXmlDomNode = NULL; // 得到关于IXMLDOMDocument 接口的指针 pXMLDOC HRESULT hr = ::CoCreateInstance( CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, ( void ** )&pXmlDoc ); if( S_OK != hr ) { return false; } //得到关于IXMLDOMNode接口的指针pXDN hr = pXmlDoc->QueryInterface( IID_IXMLDOMNode, ( void ** )&pXmlDomNode ); if( S_OK != hr ) { return false; } VARIANT_BOOL bOk; _variant_t varSrc = sXMLDocText.c_str(); IXMLDOMElement *pRootNode; // 根结点 IXMLDOMNode *pNode; IXMLDOMNode *pNodeOut; pXmlDoc->loadXML( varSrc.bstrVal, &bOk ); // 从字符串建立XML文档 // 取得根结点 pXmlDoc->get_documentElement( &pRootNode ); pRootNode->get_nodeName( &varSrc.bstrVal ); // 遍历根结点的子结点 for( pRootNode->get_firstChild( &pNode ); pNode != NULL; pNode->get_nextSibling( &pNode ) ) { pNode->get_nodeName( &varSrc.bstrVal ); // cout << "Node name: " << varSrc.operator _bstr_t().operator char *() << endl; string sNodeName = _bstr_t( varSrc.bstrVal ).operator char *(); if( sNodeName == string( "Depth" ) ) { // 发现 Depth 结点 varSrc = ReadNodeText( pNode ); sp.nDepth = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "Depth value: " << sp.nDepth << endl; } else if( sNodeName == string( "TryTimes" ) ) { // 发现 TryTimes 结点 varSrc = ReadNodeText( pNode ); sp.nTryTimes = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "TryTimes value: " << sp.nTryTimes << endl; } else if( sNodeName == string( "Timeout" ) ) { // 发现 Timeout 结点 varSrc = ReadNodeText( pNode ); sp.nTimeout = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "Timeout value: " << sp.nTimeout << endl; } else if( sNodeName == string( "MaxTreadCount" ) ) { // 发现 MaxTreadCount 结点 varSrc = ReadNodeText( pNode ); sp.nMaxTreadCount = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "MaxTreadCount value: " << sp.nMaxTreadCount << endl; } else if( sNodeName == string( "SubScan" ) ) { // 发现 SubScan 结点 varSrc = ReadNodeText( pNode ); sp.bSubScan = ( string( _bstr_t( varSrc.bstrVal ).operator char *() ) == XML_TRUE ) ; //cout << "SubScan value: " << sp.bSubScan << endl; } else if( sNodeName == string( "DefaultCommunityGet" ) ) { // 发现 DefaultCommunityGet 结点 varSrc = ReadNodeText( pNode ); sp.sDefaultCommunityOfGet = _bstr_t( varSrc.bstrVal ).operator char *(); //cout << "DefaultCommunityGet value: " << sp.sDefaultCommunityOfGet << endl; } else if( sNodeName == string( "DefaultCommunitySet" ) ) { // 发现 DefaultCommunitySet 结点 varSrc = ReadNodeText( pNode ); sp.sDefaultCommunityOfSet = _bstr_t( varSrc.bstrVal ).operator char *(); //cout << "DefaultCommunityOfSet value: " << sp.sDefaultCommunityOfSet << endl; } else if( sNodeName == string( "Communitys" ) ) { // 发现 Communitys 结点 ReadCommunityListNode( pNode, sp.vcCommunityList ); } else if( sNodeName == string( "AddStartEnds" ) ) { // 发现 AddStartEnds 结点 ReadIpScopeListNode( pNode, sp.viIpScopeList ); // 读IpScopeList结点 } else if( sNodeName == string( "FilterStartEnds" ) ) { // 发现 FilterStartEnds 结点 ReadIpScopeListNode( pNode, sp.viFilterStartEndList ); // 读IpScopeList结点 } else if( sNodeName == string( "SubnetList" ) ) { // 发现 SubnetList 结点 ReadIpScopeListNode( pNode, sp.viSubnetList ); // 读IpScopeList结点 } else if( sNodeName == string( "SeedIpList" ) ) { // 发现 SeedIp 结点 ReadStringListNode( pNode, sp.vsSeedIpList ); } } // cout << "XMLToScanParam done successfully!" << endl; } catch(...) { return false; } return true; }
/******************************************************************** XmlLoadDocumentEx - *********************************************************************/ extern "C" HRESULT DAPI XmlLoadDocumentEx( __in_z LPCWSTR wzDocument, __in DWORD dwAttributes, __out IXMLDOMDocument** ppixdDocument ) { HRESULT hr = S_OK; VARIANT_BOOL vbSuccess = 0; // RELEASEME IXMLDOMDocument* pixd = NULL; IXMLDOMParseError* pixpe = NULL; BSTR bstrLoad = NULL; if (!wzDocument || !*wzDocument) { hr = E_UNEXPECTED; ExitOnFailure(hr, "string must be non-null"); } hr = XmlCreateDocument(NULL, &pixd); if (hr == S_FALSE) { hr = E_FAIL; } ExitOnFailure(hr, "failed XmlCreateDocument"); if (dwAttributes & XML_LOAD_PRESERVE_WHITESPACE) { hr = pixd->put_preserveWhiteSpace(VARIANT_TRUE); ExitOnFailure(hr, "failed put_preserveWhiteSpace"); } // Security issue. Avoid triggering anything external. hr = pixd->put_validateOnParse(VARIANT_FALSE); ExitOnFailure(hr, "failed put_validateOnParse"); hr = pixd->put_resolveExternals(VARIANT_FALSE); ExitOnFailure(hr, "failed put_resolveExternals"); bstrLoad = ::SysAllocString(wzDocument); ExitOnNull(bstrLoad, hr, E_OUTOFMEMORY, "failed to allocate bstr for Load in XmlLoadDocumentEx"); hr = pixd->loadXML(bstrLoad, &vbSuccess); if (S_FALSE == hr) { hr = HRESULT_FROM_WIN32(ERROR_OPEN_FAILED); } if (FAILED(hr) && S_OK == pixd->get_parseError(&pixpe)) { XmlReportParseError(pixpe); } ExitOnFailure(hr, "failed loadXML"); hr = S_OK; LExit: if (ppixdDocument) { *ppixdDocument = pixd; pixd = NULL; } ReleaseBSTR(bstrLoad); ReleaseObject(pixd); ReleaseObject(pixpe); return hr; }