Инструмент 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 объявленного в библиотеке типов. Coclass, помеченные атрибутом control, будут обернуты подклассом QAxWidget.
Классы, которые оборачивают создаваемые coclass (т.е. coclass, которые не помечены как noncreatable), имеют конструктор по умолчанию; обычно это единственный класс типа Application.
Outlook::Application *outlook = new Outlook::Application;
Все остальные классы могут быть созданы только путем передачи указателя на интерфейс IDispatch в конструктор; однако эти классы не следует создавать явно. Вместо этого используйте соответствующий API уже созданных объектов.
Outlook::_NameSpace *session = outlook->Session();
Все обертки coclass также имеют один конструктор, принимающий класс-обертку для каждого реализованного интерфейса.
Outlook::NameSpace *session = outlook->Session();
Вам необходимо создать coclass, чтобы иметь возможность подключиться к сигналам подобъекта. Обратите внимание, что конструктор удаляет объект интерфейса, поэтому следующее приведет к ошибке сегментации:
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.13/activeqt-dumpcpp.html