dumpcpp
工具为类型库生成 C++ 名称空间。
要为类型库生成 C++ 名称空间,调用
dumpcpp
采用下列命令行参数:
选项 | 结果 |
---|---|
input | 生成文档编制为 input . input 可以指定类型库文件或类型库 ID,或 CLSID (类 ID) 或 ProgID 为对象 |
-o file | 写入类声明到 file .h 和元对象信息到 file .cpp |
-n namespace | 生成 C++ 名称空间 namespace |
-nometaobject | 不生成带元对象信息的 .cpp 文件。那么,在运行时生成元对象。 |
-getfile libid | 打印文件名为类型库 libid 到 stdout (标准输出) |
-compat | 采用 dynamicCall 兼容 API 生成名称空间 |
-v | 打印版本信息 |
-h | 打印帮助 |
Running the tool manually (and perhaps even checking the generated files into your version control system) is usually sufficient, as type libraries change very rarely. If your type library changes frequently, then you can integrate
dumpcpp
到
qmake
构建系统。在 .pro 文件中,列出要在 TYPELIBS 变量中使用的类型库:
TEMPLATE = app TARGET = qutlook QT += widgets axcontainer TYPELIBS = $$system(dumpcpp -getfile {00062FFF-0000-0000-C000-000000000046})
生成的名称空间将声明所有枚举,及一个
QAxObject
子类为每个
coclass
and
interface
声明在类型库。标记辅助类采用
control
属性将被包裹通过
QAxWidget
子类。
这些类包裹可创建辅助类 (即:不将辅助类标记为
noncreatable
) 拥有默认构造函数;通常,这是单个类的类型
Application
.
Outlook::Application *outlook = new Outlook::Application;
所有其它类只可以通过将 IDispatch 接口指针传递给构造函数,来创建;不管怎样,不应明确创建这些类。代之,应使用已创建对象的适当 API。
Outlook::_NameSpace *session = outlook->Session();
所有辅助类包裹器还有一构造函数,为实现每个接口接受接口包裹器类。
Outlook::NameSpace *session = outlook->Session();
必须创建辅助类才能连接子对象信号。注意,构造函数会删除接口对象,所以以下会导致分段故障:
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
库。然后运行 make 工具在
tools/dumpcpp
.