在 Qt 中使用 ActiveX 控件和 COM
QAxContainer 模块是ActiveQt框架的一部分。它提供了一个实现QWidget 子类的库(QAxWidget ),该类作为ActiveX控件的容器;以及一个实现QObject 子类的库(QAxObject ),可用于轻松访问非视觉COM对象。 通过QAxScript 、QAxScriptManager 和QAxScriptEngine 类,可以对使用这些类嵌入的COM对象进行脚本操作,并且有一套工具可轻松地通过编程方式访问COM对象。
该模块由六个类组成
- QAxBase 是一个抽象类,提供用于初始化和访问 COM 对象或 ActiveX 控件的 API。
- QAxObject 提供了一个QObject ,该类封装了 COM 对象。
- QAxWidget 是一个封装 ActiveX 控件的QWidget 。
- QAxScriptManager、QAxScript 和QAxScriptEngine 为 Windows Script Host 提供了一个接口。
本文提供了一些使用标准 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 成员时出错:缺少非可选参数
QAxBase::dynamicCall() 调用失败——函数原型正确,但提供的参数过少。
调用 IDispatch 成员时出错:参数 n 的类型不匹配
QAxBase::dynamicCall() 调用失败——函数原型正确,但索引为n 的参数类型不正确,且无法将其强制转换为正确类型。
QAxScriptManager::call():没有脚本提供此函数
您尝试调用通过不提供内省功能的引擎(例如 ActivePython 或 ActivePerl)提供的函数。您需要在相应的QAxScript 对象上直接调用该函数。
另请参阅 ActiveQt 框架。
© 2026 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.