Spec-Zone.ru › Qt 5.11

Использование 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 ActiveX Test Container демонстрирует загрузку скриптовых файлов.

Вызов функции с помощью собственных 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/archives/qt-5.11/activeqt-container.html

Spec-Zone.ru

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