在 Qt 中使用 ActiveX 控件和 COM

The QAxContainer 模块属于 ActiveQt 框架。它提供库实现 QWidget 子类, QAxWidget 充当 ActiveX 控件容器,和 QObject 子类, QAxObject 可以用于轻松访问非视觉 COM (组件对象模型) 对象。可以使用由这些类嵌入的脚本化 COM 对象透过 QAxScript , QAxScriptManager and QAxScriptEngine 类,和一组 tools 使之易于以编程方式访问 COM 对象。

模块由 6 个类组成

  1. QAxBase 是提供初始化和访问 COM (组件对象模型) 对象或 ActiveX 控件的 API 抽象类。
  2. QAxObject 提供 QObject 包裹 COM (组件对象模型) 对象。
  3. QAxWidget QWidget 用于包裹 ActiveX 控件。
  4. QAxScriptManager , QAxScript and QAxScriptEngine 提供 WSH (Windows 脚本主机) 接口。

某些 范例应用程序 使用标准 ActiveX 控件来提供高级用户界面功能。

话题:

使用库

要构建可以托管 COM (组件对象模型) 对象和 ActiveX 控件的 Qt 应用程序,链接应用程序到 QAxContainer 模块通过添加

QT += axcontainer
					

到应用程序的 .pro 文件。

分发 QAxContainer 应用程序

The QAxContainer 库是静态的,所以,不需要重新分发任何额外文件当使用此模块时。注意,不管怎样,正使用的 ActiveX 服务器二进制文件可能未安装在目标系统中,所以,必须在应用程序安装过程中将它们与软件包一起随附并注册。

实例化 COM 对象

要实例化 COM 对象使用 QAxBase::setControl () API,或将对象名称直接传递给构造函数对于 QAxBase 子类正使用的。

可以按多种格式指定控件,但最快且最强大的格式是直接使用对象的 CLSID (类 ID)。CLSID 可以预先准备对象应该在其中运行的远程计算机的有关信息,且可以包括许可控件的许可密钥。

典型错误消息

ActiveQt 会将错误消息打印到调试输出,若在运行时遇到错误状况。通常,必须在调试器中运行程序以查看这些消息 (如:在 Visual Studio 的调试输出中)。

无法实例化请求控件

请求控件按 QAxBase::setControl () 未安装在此系统中,或不可访问对于当前用户。

控件可能要求管理员权限,或许可密钥。若控件已获得许可,将许可密钥传递给 QAxBase::setControl 如文档化。

访问对象 API

ActiveQt 为 COM (组件对象模型) 对象提供 Qt API,并以 Qt 等价物替换 COM 数据类型。

调用 COM 对象的 API 有 4 种方式:

  • 生成 C++ 名称空间
  • 按名称调用
  • 透过脚本引擎
  • 使用本机 COM 接口

生成 C++ 名称空间

要为想要访问的类型库生成 C++ 名称空间,使用 dumpcpp 工具。在想要使用的类型库手动运行此工具,或将它集成到构建系统通过把类型库添加到 TYPELIBS 变量在应用程序的 .pro 文件:

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 是可用的,从属所用脚本语言。

The ActiveX 测试容器 演示脚本文件的加载。

使用本机 COM 接口调用函数

要调用无法凭借任何上述方法访问的 COM 对象的函数是可能的,直接请求 COM 接口使用 QAxBase::queryInterface ()。要获得各自接口类的 C++ 定义,使用 #import 指令采用由控件提供的类型库;见编译器手册了解细节。

典型错误消息

ActiveQt 会将错误消息打印到调试输出,若在运行时遇到错误状况。通常,必须在调试器中运行程序以查看这些消息 (如:在 Visual Studio 的调试输出中)。

QAxBase::internalInvoke:没有这种方法

A QAxBase::dynamicCall () 失败 - 函数原型不匹配对象 API 中的任何可用函数。

调用 IDispatch 成员出错:缺少非可选参数

A QAxBase::dynamicCall () 失败 - 函数原型正确,但提供的参数太少。

调用 IDispatch 成员出错:第 n 个参数的类型不匹配

A QAxBase::dynamicCall () 失败 - 函数原型正确,但参数在索引 n 类型错误,且无法强制为正确类型。

QAxScriptManager::call():脚本没有提供此函数

试着调用提供函数透过不提供自省的引擎 (即 ActivePython 或 ActivePerl )。需要直接调用函数在各自的 QAxScript 对象。

另请参阅 ActiveQt 框架 .