Использование ActiveX-контролей и COM в Qt
Модуль QAxContainer является частью фреймворка ActiveQt. Он предоставляет библиотеку, реализующую подкласс QWidget, QAxWidget, который выступает в качестве контейнера для ActiveX-контролей, и подкласс QObject, QAxObject, который может использоваться для простого доступа к невизуальным COM-объектам. Сценарии COM-объектов, встроенных с помощью этих классов, возможны через классы QAxScript, QAxScriptManager и QAxScriptEngine, а набор инструментов упрощает программно доступ к COM-объектам.
Модуль состоит из шести классов
- QAxBase — абстрактный класс, который предоставляет API для инициализации и доступа к COM-объекту или ActiveX-контролю.
- QAxObject предоставляет QObject, который оборачивает COM-объект.
- QAxWidget — QWidget, который оборачивает ActiveX-контроль.
- QAxScriptManager, QAxScript и QAxScriptEngine предоставляют интерфейс к Windows Script Host.
Предоставляются некоторые примеры приложений, которые используют стандартные ActiveX-контроли для обеспечения функциональности пользовательского интерфейса высокого уровня.
Темы:
Использование библиотеки
Для построения приложений Qt, которые могут размещать COM-объекты и ActiveX-контроли, необходимо связать приложение с модулем QAxContainer путем добавления
QT += axcontainer
в файл вашего приложения .pro.
Распространение приложений QAxContainer
Библиотека QAxContainer является статической, поэтому нет необходимости перераспределять какие-либо дополнительные файлы при использовании этого модуля. Однако обратите внимание, что двоичные файлы ActiveX-сервера, которые вы используете, могут быть не установлены на целевой системе, поэтому вам нужно предоставить их вместе с вашим пакетом и зарегистрировать их во время установки вашего приложения.
Инициализация COM-объектов
Для инициализации COM-объекта используйте API QAxBase::setControl() или передайте имя объекта напрямую в конструктор подкласса QAxBase, который вы используете.
Контроль можно указать в различных форматах, но самый быстрый и мощный формат — использование идентификатора класса (CLSID) объекта напрямую. Идентификатор класса может быть дополнен информацией о удалённой машине, на которой должен выполняться объект, и может включать ключ лицензии для лицензированных контролей.
Типичные сообщения об ошибках
ActiveQt выводит сообщения об ошибках в выходные данные отладки при возникновении ситуаций с ошибками во время выполнения. Обычно для просмотра этих сообщений необходимо запустить вашу программу в отладчике (например, в выходных данных отладки Visual Studio).
Запрошенный контроль не может быть инициализирован
Запрошенный в QAxBase::setControl() контроль не установлен в этой системе или недоступен для текущего пользователя.
Контроль может потребовать прав администратора или ключа лицензии. Если контроль лицензирован, передайте ключ лицензии в QAxBase::setControl, как указано в документации.
Доступ к API объекта
ActiveQt предоставляет Qt API для COM-объекта и заменяет COM-типы данными эквивалентами Qt.
Существует четыре способа вызова API COM-объекта:
- Генерация C++ пространства имен
- Вызов по имени
- Через движок сценариев
- Использование собственных COM-интерфейсов
Генерация C++ пространства имен
Для генерации C++ пространства имен для библиотеки типов, к которой вы хотите получить доступ, используйте инструмент dumpcpp. Запустите этот инструмент вручную на библиотеке типов, которую вы хотите использовать, или интегрируйте его в систему сборки, добавив библиотеки типов в переменную TYPELIBS в файле вашего приложения .pro:
TYPELIBS = file.tlb
Обратите внимание, что dumpcpp может не иметь возможности экспонировать все API в библиотеке типов.
Включите полученный заголовочный файл в свой код, чтобы получить доступ к API объекта через сгенерированные C++ классы. Дополнительную информацию см. в примере Qutlook.
Вызов по имени
Используйте QAxBase::dynamicCall() и QAxBase::querySubObject() а также API QObject::setProperty() и QObject::property() для вызова методов и свойств COM-объекта по их имени. Используйте инструмент dumpdoc для получения документации Qt API для любого COM-объекта и его подобъектов; обратите внимание, что не все API COM-объекта могут быть доступны.
Дополнительную информацию см. в примере Media Player.
Вызов функции через движок сценариев
Приложение Qt может разместить любой движок ActiveScript, установленный в системе. Затем движок сценариев может выполнить скриптовый код, который обращается к COM-объектам.
Для инициализации движка сценариев используйте QAxScriptManager::addObject() для регистрации COM-объектов, к которым вы хотите получить доступ из скрипта, и QAxScriptManager::load() для загрузки скриптового кода в движок. Затем вызовите функции скрипта, используя QAxScriptManager::call() или QAxScript::call().
Какие API COM-объекта доступны через скриптинг, зависит от используемого языка сценариев.
Контейнер ActiveX Test демонстрирует загрузку скриптовых файлов.
Вызов функции с помощью собственных COM-интерфейсов
Для вызова функций COM-объекта, к которым невозможно получить доступ ни одним из вышеперечисленных методов, можно запросить COM-интерфейс напрямую, используя QAxBase::queryInterface(). Чтобы получить C++ определение соответствующих классов интерфейсов, используйте директиву #import, используя предоставленную с контролем библиотеку типов; см. руководство по вашему компилятору для получения подробной информации.
Типичные сообщения об ошибках
ActiveQt выводит сообщения об ошибках в выходные данные отладки при возникновении ситуаций с ошибками во время выполнения. Обычно для просмотра этих сообщений необходимо запустить вашу программу в отладчике (например, в выходных данных отладки Visual Studio).
QAxBase::internalInvoke: Нет такого метода
QAxBase::dynamicCall() потерпел неудачу — прототип функции не совпал ни с одной функцией, доступной в API объекта.
Ошибка вызова IDispatch-члена: Не хватает необязательного параметра
QAxBase::dynamicCall() потерпел неудачу — прототип функции был корректным, но было предоставлено слишком мало параметров.
Ошибка вызова IDispatch-члена: Несоответствие типов в параметре n
QAxBase::dynamicCall() потерпел неудачу — прототип функции был корректным, но параметр с индексом n имел неверный тип и не смог быть приведен к правильному типу.
QAxScriptManager::call(): Ни один скрипт не предоставляет эту функцию
Вы пытаетесь вызвать функцию, которая предоставляется движком, который не предоставляет интроспекцию (например, ActivePython или ActivePerl). Вам нужно вызвать функцию напрямую на соответствующем объекте QAxScript.
См. также Фреймворк ActiveQt.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/activeqt-container.html