dumpcpp 工具(ActiveQt)

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

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

选项结果
inputinput 生成文档。input 可以指定类型库文件或类型库 ID,或对象的 CLSID 或 ProgID
-o 文件将类声明写入 file.h,并将元对象信息写入 file.cpp
-n 命名空间生成 C++ 命名空间 命名空间
-nometaobject不生成包含元对象信息的 .cpp 文件。元对象将在运行时生成。
-getfile libid将类型库 libid 的文件名打印到 stdout
-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})

生成的命名空间将声明所有枚举,以及为类型库中声明的每个 coclassinterface 生成一个 QAxObject 子类。标记有 control 属性的 coclasses 将由 QAxWidget 子类封装。

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

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

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

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

所有 coclass 封装类都有一个构造函数,接受每个实现接口的接口封装类。

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

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

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

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

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

在这种情况下,必须显式创建正确的包装类。

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

当然,您可以直接使用返回的IDispatch*,在这种情况下,当您完成接口后必须调用Release()

命名空间中的所有类都带有宏,您可以使用它从DLL中导出或导入它们。为了做到这一点,在包含头文件之前,将宏声明为展开为__declspec(dllimport/export)

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

© 2024 Qt公司有限公司。本文件内包含的文档贡献是各自所有者的版权。本文件提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可的。Qt和相应的标志是芬兰以及其他国家和地区的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。