The
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 | 打印幫助 |
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
) 擁有默認構造函數;通常,這是單個類的類型
應用程序
.
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
.