Spec-Zone.ru › Qt 5.15

Использование ActiveX-контролов и COM в Qt

Модуль QAxContainer является частью фреймворка ActiveQt. Он предоставляет библиотеку, реализующую подкласс QWidget, QAxWidget, который выступает в роли контейнера для ActiveX-контролов, и подкласс QObject, QAxObject, который может использоваться для легкого доступа к невизуальным COM-объектам. Скриптовое управление COM-объектами, встроенными с помощью этих классов, возможно через классы QAxScript, QAxScriptManager и QAxScriptEngine, а набор инструментов упрощает программно-ориентированный доступ к COM-объектам.

Модуль состоит из шести классов

  1. QAxBase — это абстрактный класс, предоставляющий API для инициализации и доступа к COM-объекту или ActiveX-контролу.
  2. QAxObject предоставляет QObject, который оборачивает COM-объект.
  3. QAxWidget — это QWidget, который оборачивает ActiveX-контрол.
  4. 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 демонстрирует загрузку файлов сценариев.

Вызов функции с использованием собственных интерфейсов 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-5.15/activeqt-container.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API