在 Qt 中使用 ActiveX 控件和 COM
QAxContainer 模块是 ActiveQt 框架的一部分。它提供了一个实现 QWidget 子类的库,QAxWidget,作为 ActiveX 控件的容器,以及一个 QObject 子类的库,QAxObject,可以用来轻松访问非视觉 COM 对象。通过 QAxScript、QAxScriptManager 和 QAxScriptEngine 类,可以对这些类使用的嵌入式 COM 对象进行脚本编程,并提供了一套 工具,便于以编程方式访问 COM 对象。
该模块由六个类组成
- QAxBase 是一个抽象类,它提供了一个初始化和访问 COM 对象或 ActiveX 控件的 API。
- QAxObject 提供了一个封装 COM 对象的 QObject。
- QAxWidget 是一个封装 ActiveX 控件的 QWidget。
- QAxScriptManager、QAxScript 和 QAxScriptEngine 为 Windows Script Host 提供了一个接口。
提供了一些使用标准 ActiveX 控件提供高级用户界面功能的 示例应用程序。
主题
使用库
要构建能够托管 COM 对象和 ActiveX 控件的 Qt 应用程序,在与 QAxContainer 模块建立链接时,将以下内容添加到应用程序的 .pro
文件中。
QT += axcontainer
。
分发 QAxContainer 应用程序
QAxContainer 库是静态的,所以在使用该模块时不需要重新分发任何额外的文件。然而,请注意,您使用的 ActiveX 服务器二进制文件可能不会安装在目标系统上,因此您必须将其随您的包一起提供,并在应用程序安装过程中进行注册。
实例化 COM 对象
要实例化一个 COM 对象,请使用 QAxBase::setControl() API,或者将对象的名称直接传递给您所使用的 QAxBase 子类的构造函数。
控制可以指定为多种格式,但最快且功能最强大的格式是直接使用对象的类 ID (CLSID)。类 ID 前可以添加关于应该在远程计算机上运行该对象的信息,并且可以包含授权控制项的许可证密钥。
典型错误消息
ActiveQt在运行时遇到错误情况时,将错误消息打印到调试输出中。通常,您必须运行您的程序在调试器中才能看到这些消息(例如在Visual Studio的调试输出中)。
无法实例化请求的控制
QAxBase::setControl()中请求的控制未安装在系统中,或者对当前用户不可访问。
控制可能需要管理员权限或许可密钥。如果控制已授权,则按文档中的说明将许可密钥传递给QAxBase::setControl。
访问对象API
ActiveQt为COM对象提供Qt API,并用Qt等效数据类型替换COM数据类型。
有四种方式可以在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 Test Container演示了加载脚本文件的过程。
使用原生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 框架。
© 2024 The Qt Company Ltd。本文档涉及的内容为其各自所有者的版权。本文档根据自由软件基金会公布的GNU自由文档许可证版本1.3的条款进行许可。Qt及其相关商标为The Qt Company Ltd.在芬兰和/或其他国家和地区的商标。所有其他商标均为其各自所有者的财产。