dumpcpp 工具 (ActiveQt)

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 .