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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: COM в Qt  (Прочитано 4606 раз)
Nimbus
Гость
« : Июль 20, 2011, 08:35 »

Да, название топика страшное.
Но по сути... Кто-нибудь знает как портировать ЭТОТ код на C++ (Qt)? Особенно интересует вот эта часть
Код
Python
...
from win32com.client import Dispatch
...
mapinfo = Dispatch("MapInfo.Application")
mapinfo.do('Set Next Document Parent %s Style 1' % handle)
...
 
Попробовал так:

Код
C++ (Qt)
_MapI = new QAxObject;
_MapI->setControl("MapInfo.Application");
_MapI->dynamicCall("void Do(const QString&)", QString("Set Next Document Parent %1 Style 1").arg(quint64(widget->winId())));
 

И получаю вот такую шляпу в консоль:
Код
DOS
QAxBase::dynamicCallHelper: void Do(QString): No such property in {6a5287b9-7c5f
-4944-8413-c229309d3216} [unknown]
       Candidates are:
               Version
               Visible
 
То есть там вообще два метода чтоли?
Или это уже через какие-то COM-библиотеки всё делать?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #1 : Июль 20, 2011, 09:33 »

Может стоит попробовать так
Код
C++ (Qt)
...
_MapI->dynamicCall("Do(const QString&)", QString("Set Next Document Parent %1 Style 1").arg(quint64(widget->winId())));
...
 
« Последнее редактирование: Июль 20, 2011, 09:40 от alex312 » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Июль 20, 2011, 09:35 »

Возможно QAxObject::doVerb. Просто по аналогии.
Записан
Nimbus
Гость
« Ответ #3 : Июль 27, 2011, 11:43 »

Может стоит попробовать так
Код
C++ (Qt)
...
_MapI->dynamicCall("Do(const QString&)", QString("Set Next Document Parent %1 Style 1").arg(quint64(widget->winId())));
...
 
Спасибо! И правда, так работает Улыбающийся

Теперь ещё вопросик - как сделать callback'и?
Я знаю, что ему нужно передать команду типа
Код
C++ (Qt)
_MapI->dynamicCall("Do(const QString&)", "Create Buttonpad \"MyTool\" As Toolbutton ID 2001 DrawMode 34 Cursor 138 Calling OLE \"MyFunc\"");
И он должен будет вызывать функцию/метод класса, которая имеет имя MyFunc, в моём приложении.
По-хорошему нужно указать объект какого-либо класса, который содержит как раз этот метод. Как это сделать у QAxObject'а?

Есть у него ещё помимо Do метод SetCallback. Но вот что в него передавать и какая у него сигнатура... Как это узнать?
« Последнее редактирование: Июль 29, 2011, 09:48 от JC » Записан
Nimbus
Гость
« Ответ #4 : Июль 29, 2011, 10:37 »

Сгенерил документацию - аттачмент.
Явно видно как задать коллбэк:
Код
C++ (Qt)
void SetCallback (IDispatch* callbackobject)
 
Осталось только узнать где взять IDispatch* для объекта уведомлений. Да и как создать сам объект уведомлений?
Записан
Nimbus
Гость
« Ответ #5 : Август 04, 2011, 09:29 »

Осталось только узнать где взять IDispatch* для объекта уведомлений. Да и как создать сам объект уведомлений?
Всё, разобрался.
Пришлось своё приложение скрестить немного с MFC, а IDispatch* получать из объекта унаследованного от CCmdTarget класса.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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