static IXMLDOMDocument *createAndConfigureInterface(void) { IXMLDOMDocument *xmlDoc = (IXMLDOMDocument *)ComLibrary::_createInterface(CLSID_DOMDocument30, IID_IXMLDOMDocument); if(xmlDoc != NULL) { xmlDoc->put_async(VARIANT_FALSE); xmlDoc->put_preserveWhiteSpace(VARIANT_FALSE); xmlDoc->put_resolveExternals(VARIANT_FALSE); xmlDoc->put_validateOnParse(VARIANT_TRUE); } return xmlDoc; }
/******************************************************************* XmlLoadDocumentFromFileEx ********************************************************************/ extern "C" HRESULT DAPI XmlLoadDocumentFromFileEx( __in_z LPCWSTR wzPath, __in DWORD dwAttributes, __out IXMLDOMDocument** ppixdDocument ) { HRESULT hr = S_OK; VARIANT varPath; VARIANT_BOOL vbSuccess = 0; IXMLDOMDocument* pixd = NULL; IXMLDOMParseError* pixpe = NULL; ::VariantInit(&varPath); varPath.vt = VT_BSTR; varPath.bstrVal = ::SysAllocString(wzPath); ExitOnNull(varPath.bstrVal, hr, E_OUTOFMEMORY, "failed to allocate bstr for Path in XmlLoadDocumentFromFileEx"); 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"); } // 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"); pixd->put_async(VARIANT_FALSE); hr = pixd->load(varPath, &vbSuccess); if (S_FALSE == hr) { hr = HRESULT_FROM_WIN32(ERROR_OPEN_FAILED); } if (FAILED(hr) && S_OK == pixd->get_parseError(&pixpe)) { XmlReportParseError(pixpe); } ExitOnFailure1(hr, "failed to load XML from: %ls", wzPath); if (ppixdDocument) { *ppixdDocument = pixd; pixd = NULL; } hr = S_OK; LExit: ReleaseVariant(varPath); ReleaseObject(pixd); ReleaseObject(pixpe); return hr; }
/******************************************************************** 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; }