Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: 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 в частности? Заранее спасибо! Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 22, 2006, 11:03 1. Возможно, только если всё таки получится статически прилинковать Qt. Сам я не пытался.
2. Конечно можно. 3. не знаю 4. В ActiveQt я пока обнаружил только одну проблему. Не для каждого COM объекта удаётся сгенерить Qt-шную обёртку (через dumpcpp), для более удобного использования внешних COM объектов в Qt. добавлено спустя 41 секунду: А вообще ActiveQt очень удобная штука. Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 22, 2006, 11:16 Спасибо! Примерное на такой ответ я и надеялся ж) Единственное тут возник ещё вопрос. Мой COM-объект должен предоставлять доступ программистам к разным специфическим данным, похожим на QRect, QPoint и т.п. но не совсем. Если я правильно понимаю, то для того чтобы программист на Дэльфи видел эти данные мне придётся и их сделать COM-объектами?
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 22, 2006, 12:34 По моему ActiveQt не умеет экспортировать пользовательские структуры и классы не пораждённые от QObject, но свои простейшие классы (QRect, QSize, QPoint) он экспортирует как структуры автоматически. Также умеет экспортировать перечислимые типы (через Q_ENUMS()) и наборы флагов (через Q_FLAGS()). Это расписано в доке по QAxServer.
Так что, если я не ошибаюсь, свой простой класс/структуру вроде MyRect использовать не получится. Только если его унаследовать от QObject и сделать COM объектом, но теряется скорость, простота и добавляется неоправданный расход памяти нежели работа с простой структурой. Вообще то странно, что они не реализовали такую возможность. Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 22, 2006, 12:44 Таааак. А может подскажешь варианты кроме ActiveQt безгеморройного создания COM-server-а, экспортирующего произвольные типы? ж) (кроме mfc конечно, упаси бог!)
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 22, 2006, 15:49 Тогда советую глянуть в сторону ATL (Active Template Library). Эта библиотека как раз для этого изобреталась. А ещё можно пойти более современным путём - реализовать COM объекты на .Net :-)
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 22, 2006, 16:08 Ок, спасибо!.. Буду переваривать и разибраться дальше. ж)
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 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) Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 24, 2006, 10:41 Это нормально, потомучто ProductCode это метод объекта Word.Application и его надо звать со скобками, а lineWidth это свойство (property), по этому скобок быть не должно.
Код: WScript.Echo(obj.ProductCode()); // ok Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 24, 2006, 10:51 но тогда почему не работает и WScript.Echo(obj2.setLineWidth(10)) ? Причем через тестовый activeQt-контейнер testcon всё отлично видится и работает.
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 24, 2006, 11:00 Потомучто у данного COM объекта нет метода setLineWidth(), а есть свойство lineWidth, с которым надо работать как с обычным членом класса, т.е. присваивать и получать значение через свойство.
Например : Код: obj2.lineWidth = 1; Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 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; Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 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 отсутствует. Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 26, 2006, 11:37 А ведь действительно нету!... Но тогда вопрос, что нужно сделать чтобы этот метод появился?..
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 26, 2006, 12:07 Оказывается в примере multiple метод setLineWidth не является слотом.
Если его объявить как public slots: то он нормально экспортируется как метод. Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 26, 2006, 12:17 Спасибо, это действительно работает!. Только пока не понятно что делать с lineWidth() и вообще с функциями, что-то возвращающими. Их то как слот не объявишь.
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 26, 2006, 12:26 Почему не объявишь ? Слоты тоже могут значения возвращать. А простые функции без параметров (типа lineWidth) лучше делать как свойства.
Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: ElderOrb от Июнь 26, 2006, 12:33 Цитировать Почему не объявишь ? Слоты тоже могут значения возвращать. А простые функции без параметров (типа lineWidth) лучше делать как свойства. Чего не знал того не знал. А вообще спасибо большое, ЕЩЁ кое-что прояснилось, однако что-то мне подсказывает что я ещё задам пару вопросов на эту тему ж) Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: nEoN от Июнь 26, 2006, 12:39 Без проблем :-)
Мне самому было интересно поподробней разобраться, а то всё только в скользь ActiveQt касался :-) Название: Qt 4.1.3 - вопросы по ActiveQt Отправлено: Zmey от Июль 21, 2006, 17:21 А как мне сделать сервером такой класс:
Код: class GeneralClass : public QObject В конструктор передается указатель на объект этого класса: Код: class AsParam Во всех примерах по ActiveQt конструкторы типа этого Код: Application(QObject *parent = 0); Как при использовании сервера задавать эти параметры, конструировать этот класс (GeneralClass)? |