dumpcpp 工具(ActiveQt)
dumpcpp
工具为类型库生成 C++ 命名空间。
要为类型库生成 C++ 命名空间,请使用以下命令行参数调用dumpcpp
:
选项 | 结果 |
---|---|
输入 | 输入可指定类型库文件或类型库 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})
生成的命名空间将声明所有枚举,并为类型库中声明的每个coclass
和interface
声明一个QAxObject 子类。标有control
属性的 coclass 将被QAxWidget 子类封装。
那些封装了可创建的 coc 类(即未标记为noncreatable
的 coc 类)的类有一个默认构造函数;这通常是一个类型为Application
的单个类。
Outlook::Application *outlook = new Outlook::Application;
所有其他类都只能通过向构造函数传递 IDispatch 接口指针来创建;但这些类不应显式创建。相反,应使用已创建对象的相应 API。
Outlook::_NameSpace *session = outlook->Session();
所有的 coclass 封装类都有一个构造函数,每个接口都有一个接口封装类。
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
如果返回类型属于在其他类型库中声明的 coclass 或接口类型,则必须先包含其他类型库的命名空间头文件,然后再包含要使用的命名空间头文件(这两个头文件都必须使用本工具生成)。
默认情况下,返回子对象的方法和属性将使用类型库中的类型。函数的调用者负责删除或重新生成返回的对象。如果设置了-compat
开关,则返回 COM 对象的属性和方法的返回类型为IDispatch*
,命名空间不会为接口声明封装类。
在这种情况下,请明确创建正确的封装类:
Outlook::NameSpace *session = new Outlook::NameSpace(outlook->Session());
当然,您也可以直接使用返回的 IDispatch*,在这种情况下,您必须在使用完接口后调用Release()
。
命名空间中的所有类都标记有一个宏,可以从 DLL 中导出或导入。要做到这一点,请在包含头文件之前将宏声明为扩展到__declspec(dllimport/export)
。
要构建工具,必须首先构建QAxContainer 库。然后在tools/dumpcpp
中运行 make 工具。
© 2025 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.