Spec-Zone.ru › Qt 5.12

Использование 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.12/activeqt-container.html

Spec-Zone.ru

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