Spec-Zone.ru › Qt 5.6

Инструмент dumpcpp (ActiveQt)

Инструмент dumpcpp генерирует пространство имён C++ для библиотеки типов.

Для генерации пространства имён C++ для библиотеки типов вызовите dumpcpp со следующими параметрами командной строки:

Опция Результат
input Генерировать документацию для input. input может указывать файл библиотеки типов, идентификатор библиотеки типов, CLSID или ProgID объекта
-o file Записывает объявление класса в file.h и информацию о метаобъекте в file.cpp
-n namespace Сгенерировать пространство имён C++ namespace
-nometaobject Не генерировать файл .cpp с информацией о метаобъекте. Метаобъект затем генерируется во время выполнения.
-getfile libid Вывести имя файла для библиотеки типов libid в стандартный вывод
-compat Генерировать пространство имён с API, совместимым с dynamicCall
-v Вывести информацию о версии
-h Вывести справку

dumpcpp можно интегрировать в систему сборки qmake. В файле .pro перечислите используемые библиотеки типов в переменной TYPELIBS:

TEMPLATE = app
TARGET   = qutlook
QT += widgets axcontainer

TYPELIBS = $$system(dumpcpp -getfile {00062FFF-0000-0000-C000-000000000046})

Сгенерированное пространство имён объявляет все перечисления, а также один подкласс QAxObject для каждого coclass и interface объявленных в библиотеке типов. Coclasses, помеченные атрибутом control, будут обернуты подклассом QAxWidget.

Классы, которые обертывают создаваемые coclasses (т.е. coclasses, которые не помечены как noncreatable), имеют конструктор по умолчанию; это, как правило, один класс типа Application.

Outlook::Application *outlook = new Outlook::Application;

Все остальные классы могут быть созданы только путём передачи указателя на интерфейс IDispatch в конструктор; такие классы не должны создаваться явно. Вместо этого используйте соответствующий API уже созданных объектов.

Outlook::_NameSpace *session = outlook->Session();

Все обёртки coclass также имеют один конструктор, принимающий класс обёртки интерфейса для каждого реализованного интерфейса.

Outlook::NameSpace *session = outlook->Session();

Вам нужно создать coclasses, чтобы иметь возможность подключаться к сигналам подобъекта. Обратите внимание, что конструктор удаляет объект интерфейса, поэтому следующее приведёт к ошибке сегментации:

Outlook::_NameSpace *tmp = outlook->Session();
Outlook::NameSpace *session = new Outlook::NameSpace(tmp);
delete tmp; // or any other use of tmp: segfault

Если возвращаемый тип — это тип coclass или интерфейс, объявленный в другой библиотеке типов, вы должны включить заголовок пространства имён для этой другой библиотеки типов перед включением заголовка для пространства имён, которое вы хотите использовать (оба заголовка должны быть сгенерированы с помощью этого инструмента).

По умолчанию методы и свойства, возвращающие подобъекты, будут использовать тип из библиотеки типов. Ответственный за удаление или изменение родительского объекта возвращённого объекта — вызывающий функцию. Если установлен переключатель -compat, свойства и методы, возвращающие COM-объект, имеют возвращаемый тип IDispatch*, и пространство имён не будет объявлять классы-обёртки для интерфейсов.

В этом случае создайте соответствующий класс-обёртку явно:

Outlook::NameSpace *session = new Outlook::NameSpace(outlook->Session());

Конечно, вы можете использовать возвращаемый напрямую IDispatch*, в этом случае вам нужно вызвать Release() по завершении работы с интерфейсом.

Все классы в пространстве имён помечены макросом, который позволяет экспортировать или импортировать их из DLL. Для этого объявите макрос, который будет расширяться до __declspec(dllimport/export) перед включением заголовочного файла.

Для построения инструмента необходимо сначала построить библиотеку QAxContainer. Затем выполните вашу утилиту make в tools/dumpcpp.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/activeqt-dumpcpp.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API