Инструмент 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/qt-5.15/activeqt-dumpcpp.html