Russian Qt Forum
Апрель 25, 2024, 01:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Создание и использование COM-объекта  (Прочитано 7606 раз)
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« : Декабрь 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.
Буду рад подсказкам и предложениям.
« Последнее редактирование: Декабрь 30, 2014, 13:31 от torwig » Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Декабрь 28, 2014, 00:06 »

http://doc.qt.io/qt-5/qaxbase.html

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

Если не получится, покажите интерфейс класса "MSXML2.DOMDocument.3.0"
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Декабрь 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?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #3 : Декабрь 29, 2014, 12:06 »

Все в том же разделе Detailed Description, есть таблица соответствий параметров. Там есть:
Код:
IDispatch*	QAxObject*	QAxBase::asVariant()	QAxObject* (return value)
IUnknown* QAxObject* QAxBase::asVariant() QAxObject* (return value)
соответственно:
Код
C++ (Qt)
axObject1->dynamicCall("someMethod(IDispatch*)", axObject2->asVariant());
« Последнее редактирование: Декабрь 29, 2014, 12:07 от Johnik » Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #4 : Декабрь 30, 2014, 13:30 »

Спасибо, Johnik, все получилось.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.194 секунд. Запросов: 22.