在 Qt 中使用 ActiveX 控件和 COM
QAxContainer 模块是ActiveQt框架的一部分。它提供了一个实现QWidget 子类QAxWidget 的库,该库充当 ActiveX 控件的容器,还提供了一个QObject 子类QAxObject ,该库可用于轻松访问非可视 COM 对象。通过QAxScript 、QAxScriptManager 和QAxScriptEngine 类,可以编写脚本来嵌入使用这些类的 COM 对象,而且有一套工具可以方便地以编程方式访问 COM 对象。
该模块由六个类组成
- QAxBase 是一个抽象类,提供初始化和访问 COM 对象或 ActiveX 控件的 API。
- QAxObject QObject 是一个抽象类,它提供了一个 API,用于初始化和访问 COM 对象或 ActiveX 控件。
- QAxWidget 是一个封装 ActiveX 控件的 。QWidget
- QAxScriptManager QAxScript 和 为 Windows 脚本主机提供了一个接口。QAxScriptEngine
还提供了一些使用标准 ActiveX 控件提供高级用户界面功能的应用程序示例。
使用程序库
要构建可托管 COM 对象和 ActiveX 控件的 Qt 应用程序,可通过在应用程序的QAxContainer 模块文件中添加
QT += axcontainer
到应用程序的.pro
文件中。
分发 QAxContainer 应用程序
QAxContainer 库是静态的,因此使用该模块时无需重新分发任何其他文件。但请注意,您使用的 ActiveX 服务器二进制文件可能未安装在目标系统上,因此您必须将它们与软件包一起发送,并在应用程序的安装过程中进行注册。
实例化 COM 对象
要实例化 COM 对象,请使用 QAxBase::setControl() API,或将对象名称直接传入QAxBase 子类的构造函数。
可以用多种格式指定控件,但最快、最强大的格式是直接使用对象的类 ID (CLSID)。可以在类 ID 前添加该对象应在远程机器上运行的信息,还可以包含许可控件的许可证密钥。
典型错误信息
ActiveQt 在运行时遇到错误情况时会将错误信息打印到调试输出中。通常您必须在调试器中运行程序才能看到这些信息(例如在 Visual Studio 的调试输出中)。
请求的控件无法实例化
在 QAxBase::setControl() 中请求的控件未安装在本系统上,或当前用户无法访问。
控件可能需要管理员权限或许可证密钥。如果控件已获得许可,请将许可密钥传递给 QAxBase::setControl 并记录在案。
访问对象 API
ActiveQt 为 COM 对象提供了 Qt API,并将 COM 数据类型替换为 Qt 对应数据类型。
有四种方法可以调用 COM 对象的 API:
- 生成 C++ 命名空间
- 按名称调用
- 通过脚本引擎
- 使用本地 COM 接口
生成 C++ 命名空间
要为要访问的类型库生成 C++ 命名空间,请使用dumpcpp工具。在要使用的类型库上手动运行该工具,或将类型库添加到应用程序.pro
文件中的TYPELIBS
变量,将其集成到构建系统中:
TYPELIBS = file.tlb
请注意,dumpcpp可能无法公开类型库中的所有 API。
在代码中包含生成的头文件,以便通过生成的 C++ 类访问对象 API。更多信息,请参阅Qutlook示例。
按名称调用
使用QAxBase::dynamicCall() 和QAxBase::querySubObject() 以及QObject::setProperty() 和QObject::property() API 通过名称调用 COM 对象的方法和属性。使用dumpdoc工具获取任何 COM 对象及其子对象的 Qt API 文档;请注意,并非所有 COM 对象的 API 都可用。
通过脚本引擎调用函数
Qt 应用程序可以托管安装在系统中的任何 ActiveScript 引擎。然后,脚本引擎可以运行访问 COM 对象的脚本代码。
要实例化脚本引擎,请使用QAxScriptManager::addObject() 注册要通过脚本访问的 COM 对象,并使用QAxScriptManager::load() 将脚本代码加载到引擎中。然后使用QAxScriptManager::call() 或QAxScript::call() 调用脚本函数。
COM 对象的哪些 API 可通过脚本使用取决于所使用的脚本语言。
ActiveX 测试容器演示了脚本文件的加载。
使用本地 COM 接口调用函数
要调用无法通过上述方法访问的 COM 对象函数,可以使用QAxBase::queryInterface() 直接请求 COM 接口。要获取相应接口类的 C++ 定义,请使用#import
指令和控件提供的类型库;详情请参见编译器手册。
典型错误信息
ActiveQt 在运行时遇到错误情况时会将错误信息打印到调试输出中。通常您必须在调试器中运行程序才能看到这些信息(如在 Visual Studio 的调试输出中)。
QAxBase::internalInvoke:无此方法
QAxBase::dynamicCall() 失败--函数原型与对象的 API 中可用的任何函数都不匹配。
调用 IDispatch 成员出错:缺少非选项参数
AQAxBase::dynamicCall() 失败--函数原型正确,但提供的参数太少。
调用 IDispatch 成员出错:参数 n 类型不匹配
QAxBase::dynamicCall() 失败--函数原型正确,但位于索引n
的参数类型错误,无法强制为正确类型。
QAxScriptManager::call():没有脚本提供此函数
您试图调用一个通过不提供自省功能的引擎(即 ActivePython 或 ActivePerl)提供的函数。您需要在相应的QAxScript 对象上直接调用该函数。
另请参阅 ActiveQt 框架。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.