Парсинг XML с помощью MSXML
Давно не кодил на C++ и многое уже подзабыл.
Использую Visual Studio 2019. Пытаюсь создать XML-документ из строки:
#import "msxml3.dll"
#include <MsXml2.h>
using namespace MSXML2;
int main()
{
MSXML2::IXMLDOMDocumentPtr spXMLDoc;
spXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
spXMLDoc->load("<Parent></Parent>");
spXMLDoc.Release();
CoUninitialize();
}
Но в run-time бросает исключение:
Что я не так делаю?
Ответы (1 шт):
Вижу здесь три ошибки. Во-первых, как сказал goldstar_labs, необходимо инициализировать COM. Я использую объект - инициализатор:
struct _Init {
bool m_binitialized = false;
_Init() {
_com_util::CheckError(::CoInitialize(NULL));
m_binitialized = true;
}
~_Init() {
if(m_binitialized)
CoUninitialize();
}
} _init;
Во-вторых, #include <MsXml2.h> не нужен, более того, мешает - достаточно #import "msxml3.dll". Единственно, компилятор почему-то не всегда сразу создаёт tlh/tli файлы, лечил так: в свойствах проекта линкеру в секцию Input->Additional Dependencies добавить "msxml3.dll", запустить компиляцию, затем убрать (если кто знает более прямой путь, поправьте). С msxml6.dll такой трюк не потребовался.
И в-третьих, для загрузки XML непосредственно из аргумента изпользуется метод loadXML(), а использованный вами load() загружает из файла.
P.S. Я создавал инстанс документа так:
_com_util::CheckError(pXmlCfg.CreateInstance(CLSID_DOMDocument));
