Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: torwig от Декабрь 26, 2014, 17:49



Название: [РЕШЕНО]Создание и использование COM-объекта
Отправлено: torwig от Декабрь 26, 2014, 17:49
Здравствуйте.
До этого писал код преимущественно под Убунтой, с технологией COM не встречался.
Дано: SDK к определенному ПО, оформлено в виде .dll.
Регистрирую в системе посредством regsrv32.exe, согласно инструкции производителя.
С помощью QAxObject создаю обьект, получаю список его методов.
Дальше нужно вызывать эти методы.
И вот тут вот спотыкаюсь. Нужно создать обьект MSXML и передать его в метод. Как это сделать - пока не могу понять.
По мануалу (Делфи):
Создать XML_DOM := CreateOleObject('MSXML2.DOMDocument.3.0') as IXMLDOMDocument.
Вызвать метод GetEvents (XML_DOM as IDispatch).
Как нечто подобное сделать с помощью QAxObject?
Может у кого есть опыт работы с технологией COM. Пока сижу, Гугл насилую :)

п.с. Думал в Visual Studio сделать, но там остановился еще на этапе создания COM-обьекта из этой dll.
Буду рад подсказкам и предложениям.


Название: Re: Создание и использование COM-объекта
Отправлено: Johnik от Декабрь 28, 2014, 00:06
http://doc.qt.io/qt-5/qaxbase.html

В разделе Detailed Description (http://doc.qt.io/qt-5/qaxbase.html#details) дан пример.
Вам только нужно подставить свой <CLSID> (вы его привели в вопросе), и по аналогии со строкой:
Код
C++ (Qt)
int n = object.dynamicCall("fillList(QList<QVariant>&)", parameters).toInt()
вызывать свои методы.

Если не получится, покажите интерфейс класса "MSXML2.DOMDocument.3.0"


Название: Re: Создание и использование COM-объекта
Отправлено: torwig от Декабрь 29, 2014, 11:56
Удалось создать QAxObject("{88d96a05-f192-11d4-a65f-0040963251e5}"). (Msxm2l.DOMDocument.6.0)
Удалось вызвать с помощью dynamicCall методы loadXML() и save() для тестирования.
Тут полный перечень методов: http://msdn.microsoft.com/en-us/library/ms757878(v=vs.85).aspx
Но метод generateDocumentation() ничего не возвращает.
Теперь мне нужно его передать в один из методов моего объекта, а именно в:
Код:
int GetEvents (IDispatch* AData) [slot]

Connect a signal to this slot:

QObject::connect(sender, SIGNAL(someSignal(IDispatch*)), object, SLOT(GetEvents(IDispatch*)));
Or call the function directly:

QVariantList params = ...
int result = object->dynamicCall("GetEvents(IDispatch*)", params).toInt();

Передавать QString у меня получается, а вот как передать QAxObject?


Название: Re: Создание и использование COM-объекта
Отправлено: Johnik от Декабрь 29, 2014, 12:06
Все в том же разделе Detailed Description (http://doc.qt.io/qt-5/qaxbase.html#details), есть таблица соответствий параметров. Там есть:
Код:
IDispatch*	QAxObject*	QAxBase::asVariant()	QAxObject* (return value)
IUnknown* QAxObject* QAxBase::asVariant() QAxObject* (return value)
соответственно:
Код
C++ (Qt)
axObject1->dynamicCall("someMethod(IDispatch*)", axObject2->asVariant());


Название: Re: Создание и использование COM-объекта
Отправлено: torwig от Декабрь 30, 2014, 13:30
Спасибо, Johnik, все получилось.