Использование 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 демонстрирует загрузку файлов сценариев.
Вызов функции с помощью родных COM-интерфейсов
Для вызова функций COM-объекта, к которым невозможно получить доступ с помощью вышеперечисленных методов, можно напрямую запросить COM-интерфейс с помощью QAxBase::queryInterface(). Чтобы получить определение C++ соответствующих классов интерфейса, используйте директиву #import, используя библиотеку типов, предоставленную с контролом; см. руководство по вашему компилятору для получения подробностей.
Типичные сообщения об ошибках
ActiveQt выводит сообщения об ошибках в выходные данные отладки, когда возникают ситуации с ошибками во время выполнения. Обычно для просмотра этих сообщений необходимо запустить вашу программу в отладчике (например, в выходных данных отладки Visual Studio).
QAxBase::internalInvoke: Метод не найден
QAxBase::dynamicCall() завершился неудачно — прототип функции не соответствовал ни одной функции, доступной в API объекта.
Ошибка вызова IDispatch member: Не хватает необязательного параметра
QAxBase::dynamicCall() завершился неудачно — прототип функции был правильным, но было предоставлено слишком мало параметров.
Ошибка вызова IDispatch member: Несовпадение типа параметра 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-5.9/activeqt-container.html