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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt 4.1.3 - вопросы по ActiveQt  (Прочитано 18014 раз)
ElderOrb
Гость
« : Июнь 21, 2006, 15:46 »

Появилась задача написать на C++ библиотеку, которую могли бы использовать к примеру дэльфятники. Раньше я делал native win32 dll, имеющие ряд неприятных ограничений вроде экспортирования функций а не классов, а недавно обратил внимание что подобные вещи принято упаковывать в COM-объекты. Насколько я понял эти COM-объекты можно достаточно легко наделать на Qt, чего мне и надо.  Однако перед тем как окунуться во всё это с головой хотесь бы спросить ряд вопросов:

1. Возможно ли с помощью ActiveQt получить компонент не требующий самого Qt? (спрашиваю потому что примеры в каталоге ActiveQt при сборке статической версии Qt со статическим рантаймом компиляться отказались)
2. Можно ли будет с помощью не Qt-шного COM-клиента обращаться к Qt-шному COM-серверу?
3. Каким образом делаются callback-и в COM?
4. Какие вообще подводные камни в технологии COM в целом и ActiveQt в частности?

Заранее спасибо!
Записан
nEoN
Гость
« Ответ #1 : Июнь 22, 2006, 11:03 »

1. Возможно, только если всё таки получится статически прилинковать Qt. Сам я не пытался.
2. Конечно можно.
3. не знаю
4. В ActiveQt я пока обнаружил только одну проблему. Не для каждого COM объекта удаётся сгенерить Qt-шную обёртку (через dumpcpp), для более удобного использования внешних COM объектов в Qt.

добавлено спустя 41 секунду:

 А вообще ActiveQt очень удобная штука.
Записан
ElderOrb
Гость
« Ответ #2 : Июнь 22, 2006, 11:16 »

Спасибо! Примерное на такой ответ я и надеялся ж) Единственное тут возник ещё вопрос. Мой COM-объект должен предоставлять доступ программистам к разным специфическим данным, похожим на QRect, QPoint и т.п. но не совсем. Если я правильно понимаю, то для того чтобы программист на Дэльфи видел эти данные мне придётся и их сделать COM-объектами?
Записан
nEoN
Гость
« Ответ #3 : Июнь 22, 2006, 12:34 »

По моему ActiveQt не умеет экспортировать пользовательские структуры и классы не пораждённые от QObject, но свои простейшие классы (QRect, QSize, QPoint) он экспортирует как структуры автоматически. Также умеет экспортировать перечислимые типы (через Q_ENUMS()) и наборы флагов (через Q_FLAGS()). Это расписано в доке по QAxServer.

Так что, если я не ошибаюсь, свой простой класс/структуру вроде MyRect использовать не получится. Только если его унаследовать от QObject и сделать COM объектом, но теряется скорость, простота и добавляется неоправданный расход памяти нежели работа с простой структурой.

Вообще то странно, что они не реализовали такую возможность.
Записан
ElderOrb
Гость
« Ответ #4 : Июнь 22, 2006, 12:44 »

Таааак. А может подскажешь варианты кроме ActiveQt безгеморройного создания COM-server-а, экспортирующего произвольные типы? ж) (кроме mfc конечно, упаси бог!)
Записан
nEoN
Гость
« Ответ #5 : Июнь 22, 2006, 15:49 »

Тогда советую глянуть в сторону ATL (Active Template Library). Эта библиотека как раз для этого изобреталась. А ещё можно пойти более современным путём - реализовать COM объекты на .Net :-)
Записан
ElderOrb
Гость
« Ответ #6 : Июнь 22, 2006, 16:08 »

Ок, спасибо!.. Буду переваривать и разибраться дальше. ж)
Записан
ElderOrb
Гость
« Ответ #7 : Июнь 23, 2006, 18:07 »

Возник ещё вопрос. С помощью dumpdoc-а я сгенерил хэлп по компонентам Word.Application (Ms Word) и multipleax.QAxWidget1.2 (из примеров Qt). Далее я подумал, а не проверить ли мне как они работают через JScript и сделал вот такой файлик.

<test.js>

var obj = new ActiveXObject("Word.Application");
WScript.Echo(obj.ProductCode());

var obj2 = new ActiveXObject("multipleax.QAxWidget1.2");
WScript.Echo(obj2.lineWidth());

Если запустить этот файл то будет видно что метод Word.Application отрабатывает нормально, а метод multipleax.QAxWidget1.2 вызывает ошибку в скрипте как будто бы его и нету вовсе. Причём если попробовать вместо WScript.Echo(obj2.lineWidth()) написать WScript.Echo(obj2.lineWidth) ошибка исчезает!. Не могу понять, это фича примера или ущербность activeQt ?

Спрашиваю для того чтобы окончательно определиться с помощью чего делать COM-объекты. (очень хотелось бы с помощью activeQt)
Записан
nEoN
Гость
« Ответ #8 : Июнь 24, 2006, 10:41 »

Это нормально, потомучто ProductCode это метод объекта Word.Application и его надо звать со скобками, а lineWidth это свойство (property), по этому скобок быть не должно.

Код:
WScript.Echo(obj.ProductCode()); // ok
WScript.Echo(obj.ProductCode); // error

WScript.Echo(obj2.lineWidth()); // error
WScript.Echo(obj2.lineWidth); // ok
Записан
ElderOrb
Гость
« Ответ #9 : Июнь 24, 2006, 10:51 »

но тогда почему не работает и WScript.Echo(obj2.setLineWidth(10)) ? Причем через тестовый activeQt-контейнер testcon всё отлично видится и работает.
Записан
nEoN
Гость
« Ответ #10 : Июнь 24, 2006, 11:00 »

Потомучто у данного COM объекта нет метода setLineWidth(), а есть свойство lineWidth, с которым надо работать как с обычным членом класса, т.е. присваивать и получать значение через свойство.

Например :
Код:
obj2.lineWidth = 1;
obj2.lineWidth = obj2.lineWidth + 2;
Записан
ElderOrb
Гость
« Ответ #11 : Июнь 26, 2006, 11:02 »

Имхо всё же есть метод setLineWidth(). Вот кусок докумментации по компоненту "multipleax.QAxWidget2.1"? который я сгенерил через dumpdoc:

Цитировать

{58139D56-6BE9-4B17-937D-1B1EDEDD5B71} Reference

The {58139D56-6BE9-4B17-937D-1B1EDEDD5B71} COM object is a QAxObject with the CLSID {58139d56-6be9-4b17-937d-1b1ededd5b71}.
Interfaces
{B66280AB-08CC-4DCC-924F-58E6D7975B7D}
Event Interfaces
{9BFBBC02-EFF1-101A-84ED-00AA00341D07}
{D72BACBA-03C4-4480-B4BB-DE4FE3AA14A0}
Public Slots:
void setLineWidth(int lineWidth);
Signals:
void Click();
void DblClick();
void KeyDown(int& KeyCode, int Shift);
void KeyPress(int& KeyAscii);
void KeyUp(int& KeyCode, int Shift);
void MouseDown(int Button, int Shift, int x, int y);
void MouseMove(int Button, int Shift, int x, int y);
void MouseUp(int Button, int Shift, int x, int y);
void exception(int code, QString source, QString disc, QString help);
void propertyChanged(QString name);
void signal(QString name, int argc, void* argv);
Properties:
QString objectName;
QString control;
int lineWidth;
Записан
nEoN
Гость
« Ответ #12 : Июнь 26, 2006, 11:21 »

Цитата: "ElderOrb"
...
Public Slots:
void setLineWidth(int lineWidth);
...

В COM нет понятия слотов. По идее они как методы должны экспортироваться, но этого не происходит.

Для сравнения посмотри через OLE/COM Object Viewer
(C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\oleview.exe). Здесь метод setLineWidth отсутствует.
Записан
ElderOrb
Гость
« Ответ #13 : Июнь 26, 2006, 11:37 »

А ведь действительно нету!... Но тогда вопрос, что нужно сделать чтобы этот метод появился?..
Записан
nEoN
Гость
« Ответ #14 : Июнь 26, 2006, 12:07 »

Оказывается в примере multiple метод setLineWidth не является слотом.
Если его объявить как public slots: то он нормально экспортируется как метод.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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