Парсинг 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 шт):

Автор решения: Dmitry Ilukhin

Вижу здесь три ошибки. Во-первых, как сказал 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));
→ Ссылка