Spec-Zone.ru › Qt 5.6

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

Дополнительная информация содержится в примере 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

Spec-Zone.ru

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