[Previous: QtTest Module]
[Qt's Modules]
[Next: QAxServer Module]
Модуль QAxContainer
The QAxContainer module is a Windows-only extension for accessing ActiveX controls and COM objects. Далее...
Подробное описание
The QAxContainer module is part of the ActiveQt framework. It provides a library implementing a QWidget subclass, QAxWidget, that acts as a container for ActiveX controls, and a QObject subclass, QAxObject, that can be used to easily access non-visual COM objects. Scripting COM objects embedded using these classes is possible through the QAxScript, QAxScriptManager and QAxScriptEngine classes, and a set of tools makes it easy to access COM objects programmatically.
Модуль состоит из шести классов
- QAxBase is an abstract class that provides an API to initialize and access a COM object or ActiveX control.
- QAxObject provides a QObject that wraps a COM object.
- QAxWidget is a QWidget that wraps an ActiveX control.
- QAxScriptManager, QAxScript and QAxScriptEngine provide an interface to the Windows Script Host.
Некоторые example applications, которые используют стандартные элементы управления ActiveX для предоставления выскоуровневой функциональности пользовательскому интерфейсу.
The QAxContainer module is part of the Qt Full Framework Edition for Windows. It is not part of the Qt Open Source Edition.
Темы:
Использование библиотеки
To build Qt applications that can host COM objects and ActiveX controls link the application against the QAxContainer module by adding
CONFIG += qaxcontainer
в .pro-файл вашего приложения.
Распространение приложений QAxContainer
The QAxContainer library is static, so there is no need to redistribute any additional files when using this module. Обратите однако внимание на то, что бинарные файлы используемого вами сервера ActiveX могут не быть установлены на целевой системе, поэтому поставляйте их с вашим пакетом и регистрируйте их во время процесса установки вашего приложения.
Создание экземпляров объектов COM
To instantiate a COM object use the QAxBase::setControl() API, or pass the name of the object directly into the constructor of the QAxBase subclass you are using.
Элемент управления можно указать в ряде форматов, но наиболее быстрым и мощным форматом является использование непосредственного идентификатора класса объекта (CLSID). В идентификатор класса может быть добавлена информация об удалённой машине, на которой был запущен объект, а также может включать в себя лицензионный ключ (license key) для лицензированных элементов управления.
Типовые сообщения об ошибке
ActiveQt печатает сообщения об ошибках для отладочной информации при возникновении ошибочных ситуаций во время выполнения. Обычно чтобы увидеть эти сообщения вам нужно запустить вашу программу в отладчике (например, в отладочной информации Visual Studio).
Экземпляр запрашиваемого элемента управления не может быть создан
The control requested in QAxBase::setControl() is not installed on this system, or is not accessible for the current user.
Элементу управления возможно требуются администраторские права или лицензионный ключ. Если элемент управления лицензирован, передайте лицензионный ключ в 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++. See the Qutlook example for more information.
Вызов по имени
Use QAxBase::dynamicCall() and QAxBase::querySubObject() as well as the QObject::setProperty() and QObject::property() APIs to call the methods and properties of the COM object through their name. Use the dumpdoc tool to get the documentation of the Qt API for any COM object and its subobjects; note that not all of the COM object's APIs might be available.
See the Webbrowser example for more information.
Вызов функции через механизм сценариев
Приложение Qt может выступить хозяином любого механизма сценариев ActiveScript, установленный в системе. Механизм сценариев может затем запустить код сценария, который получает доступ к COM-объектам.
To instantiate a script engine, use QAxScriptManager::addObject() to register the COM objects you want to access from script, and QAxScriptManager::load() to load the script code into the engine. Then call the script functions using QAxScriptManager::call() or QAxScript::call().
API COM-объекта которых доступны через выполнение сценария в зависимости от используемого языка сценариев.
Тестовый контейнер ActiveX демонстрирует загрузка файлов сценариев.
Вызов функции с использованием "родных" интерфейсов COM
To call functions of the COM object that can not be accessed via any of the above methods it is possible to request the COM interface directly using QAxBase::queryInterface(). To get a C++ definition of the respective interface classes use the #import directive with the type library provided with the control; see your compiler manual for details.
Типовые сообщения об ошибке
ActiveQt печатает сообщения об ошибках для отладочной информации при возникновении ошибочных ситуаций во время выполнения. Обычно чтобы увидеть эти сообщения вам нужно запустить вашу программу в отладчике (например, в отладочной информации Visual Studio).
QAxBase::internalInvoke: No such method
A QAxBase::dynamicCall() failed - the function prototype did not match any function available in the object's API.
Error calling IDispatch member: Non-optional parameter missing
A QAxBase::dynamicCall() failed - the function prototype was correct, but too few parameters were provided.
Error calling IDispatch member: Type mismatch in parameter n
A QAxBase::dynamicCall() failed - the function prototype was correct, but the paramter at index n was of the wrong type and could not be coerced to the correct type.
QAxScriptManager::call(): No script provides this function
Вы пытались вызвать функцию, которая предоставляется механизмом, который не предоставляет интроспекцию (т.е. ActivePython или ActivePerl). You need to call the function directly on the respective QAxScript object.
Смотрите также Каркас ActiveQt.
[Previous: QtTest Module]
[Qt's Modules]
[Next: QAxServer Module]
|