IXMLDOMDocument *XmlParser::_openFile(const LPWSTR file, XMLERRORDATA *error) { if(error) { error->errorCode = -1; error->line = -1; error->reason = NULL; } bool ok = false; IXMLDOMDocument *x = createAndConfigureInterface(); if(x) { VARIANT_BOOL bl; VARIANT str; //Выделяем строку. CWA(oleaut32, VariantInit)(&str); str.vt = VT_BSTR; str.bstrVal = CWA(oleaut32, SysAllocString)(file); if(str.bstrVal != NULL) { //Загружаем файл. if(x->load(str, &bl) == S_OK && bl == VARIANT_TRUE)ok = true; //Получаем ошибку. else if(error) { IXMLDOMParseError *ierror; if(x->get_parseError(&ierror) == S_OK) { long l; BSTR reason = NULL; //Заполняем структуру. if(ierror->get_errorCode(&l) == S_OK)error->errorCode = l; if(ierror->get_line(&l) == S_OK)error->line = l; if(ierror->get_reason(&reason) == S_OK)error->reason = reason; ierror->Release(); } } CWA(oleaut32, VariantClear)(&str); } //Объект не создан, освобождаем интерфейс. if(ok == false) { x->Release(); x = NULL; } } return x; }
IXMLDOMDocument *XmlParser::_openFile(const LPWSTR file, XMLERRORDATA *error) { if(error) { error->errorCode = -1; error->line = -1; error->reason = NULL; } bool ok = false; IXMLDOMDocument *x = createAndConfigureInterface(); if(x) { VARIANT_BOOL bl; VARIANT str; //Select the line. CWA(oleaut32, VariantInit)(&str); str.vt = VT_BSTR; str.bstrVal = CWA(oleaut32, SysAllocString)(file); if(str.bstrVal != NULL) { //Load the file. if(x->load(str, &bl) == S_OK && bl == VARIANT_TRUE)ok = true; //Get an error. else if(error) { IXMLDOMParseError *ierror; if(x->get_parseError(&ierror) == S_OK) { long l; BSTR reason = NULL; //Fill in the structure. if(ierror->get_errorCode(&l) == S_OK)error->errorCode = l; if(ierror->get_line(&l) == S_OK)error->line = l; if(ierror->get_reason(&reason) == S_OK)error->reason = reason; ierror->Release(); } } CWA(oleaut32, VariantClear)(&str); } //The object is not created, we release interface. if(ok == false) { x->Release(); x = NULL; } } return x; }