dumpcpp 工具(ActiveQt)

dumpcpp 工具可为类型库生成C++命名空间。

要为类型库生成 C++ 命名空间,请使用以下命令行参数调用dumpcpp :

选项结果
输入为“输入”生成文档。“输入”可以指定类型库文件、类型库 ID,或是对象的 CLSID 或 ProgID
-o 文件将类声明写入file.h,并将元对象信息写入file.cpp
-n 命名空间生成 C++ 命名空间namespace
-nometaobject不生成包含元对象信息的 .cpp 文件。此时,元对象将在运行时生成。
-getfile libid将类型库libid的文件名输出到标准输出
-compat生成与 dynamicCall 兼容的 API 的命名空间
-controlname在 setControl() 中使用控件类名代替 UUID
-v打印版本信息
-h显示帮助

通常只需手动运行该工具(甚至可能将生成的文件提交到版本控制系统中)就足够了,因为类型库很少发生变化。如果您的类型库频繁变更,则可以将dumpcpp 集成到qmake 构建系统中。在您的 .pro 文件中,将要使用的类型库列在 TYPELIBS 变量中:

TEMPLATE = app
TARGET   = qutlook
QT += widgets axcontainer

TYPELIBS = $$system(dumpcpp -getfile {00062FFF-0000-0000-C000-000000000046})

生成的命名空间将声明所有枚举,并针对类型库中声明的每个coclass 和interface 分别声明一个QAxObject 子类。标记为control 属性的 coclasses 将被QAxWidget 子类封装。

那些封装可创建协类(即未标记为noncreatable 的协类)的类具有默认构造函数;这通常是一个类型为Application 的单一类。

Outlook::Application *outlook = new Outlook::Application;

所有其他类只能通过向构造函数传递一个 IDispatch 接口指针来创建;但不应显式创建这些类。相反,应使用已创建对象的相应 API。

Outlook::_NameSpace *session = outlook->Session();

所有共类封装类还各有一个构造函数,该构造函数针对每个实现的接口,接受一个相应的接口封装类。

Outlook::NameSpace *session = outlook->Session();

您必须创建 coclass 才能连接到子对象的信号。请注意,构造函数会删除接口对象,因此以下代码会导致段错误:

Outlook::_NameSpace *tmp = outlook->Session();
Outlook::NameSpace *session = new Outlook::NameSpace(tmp);
delete tmp; // or any other use of tmp: segfault

如果返回类型是另一个类型库中声明的共类或接口类型,则必须在包含要使用的命名空间头文件之前,先包含该其他类型库的命名空间头文件(这两个头文件都必须由本工具生成)。

默认情况下,返回子对象的方法和属性将使用类型库中的类型。函数调用方负责删除或重新关联返回的对象。如果启用了-compat 开关,返回 COM 对象的属性和方法的返回类型将为IDispatch* ,且该命名空间不会为接口声明包装类。

在这种情况下,请显式创建正确的包装类:

Outlook::NameSpace *session = new Outlook::NameSpace(outlook->Session());

当然,您也可以直接使用返回的 IDispatch*,但在此情况下,使用完该接口后必须调用Release() 。

该命名空间中的所有类都带有宏标记,允许您从 DLL 中导出或导入它们。要实现这一点,请在包含头文件之前,声明该宏展开为__declspec(dllimport/export) 。

要构建该工具,您必须先构建QAxContainer 库。然后在tools/dumpcpp 中运行您的 make 工具。

© 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.