Инструмент 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 | Сгенерировать пространство имён с совместимой с dynamicCall API |
| -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. Затем запустите инструмент сборки в tools/dumpcpp.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/activeqt-dumpcpp.html