在 Qt 中使用 ActiveX 控件和 COM

QAxContainer 模块是 ActiveQt 框架的一部分。它提供了一个实现 QWidget 子类的库,QAxWidget,作为 ActiveX 控件的容器,以及一个 QObject 子类的库,QAxObject,可以用来轻松访问非视觉 COM 对象。通过 QAxScriptQAxScriptManagerQAxScriptEngine 类,可以对这些类使用的嵌入式 COM 对象进行脚本编程,并提供了一套 工具,便于以编程方式访问 COM 对象。

该模块由六个类组成

  1. QAxBase 是一个抽象类,它提供了一个初始化和访问 COM 对象或 ActiveX 控件的 API。
  2. QAxObject 提供了一个封装 COM 对象的 QObject
  3. QAxWidget 是一个封装 ActiveX 控件的 QWidget
  4. QAxScriptManagerQAxScriptQAxScriptEngine 为 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.在芬兰和/或其他国家和地区的商标。所有其他商标均为其各自所有者的财产。