Использование 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.
Дополнительная информация содержится в примере Webbrowser.
Вызов функции через движок сценариев
Qt-приложение может размещать любой движок ActiveScript, установленный в системе. Затем движок сценариев может выполнять скриптовый код, который обращается к объектам COM.
Для инициализации движка сценариев используйте QAxScriptManager::addObject(), чтобы зарегистрировать объекты COM, к которым вы хотите получить доступ из скрипта, и QAxScriptManager::load(), чтобы загрузить скриптовый код в движок. Затем вызывайте функции скрипта с помощью QAxScriptManager::call() или QAxScript::call().
Какие API объекта COM доступны через сценарии, зависит от используемого языка сценариев.
Контейнер для тестирования ActiveX (ActiveX Test Container) демонстрирует загрузку скриптовых файлов.
Вызов функции с помощью собственных интерфейсов 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/archives/qt-5.6/activeqt-container.html