dumpcppツール(ActiveQt)

dumpcpp ツールは、タイプ・ライブラリの C++ 名前空間を生成します。

タイプ・ライブラリのC++名前空間を生成するには、以下のコマンドライン・パラメーターを指定してdumpcpp

オプション結果
入力inputには、タイプ・ライブラリ・ファイル、タイプ・ライブラリ ID、またはオブジェクトの CLSID または ProgID を指定できます。
-o fileクラス宣言をfile.h に、メタ・オブジェクト情報をfile.cpp に書き込みます。
-n 名前空間C++ 名前空間namespace を生成します
-メタ・オブジェクトメタ・オブジェクト情報を含む.cppファイルを生成しません。メタ・オブジェクトは実行時に生成されます。
-getfile libidtypelibrarylibidのファイル名を標準出力に出力する。
-compatdynamicCall互換のAPIを持つ名前空間を生成する。
-コントロール名setControl() で、UUID の代わりにコントロール・クラス名を使用します。
-vバージョン情報を出力します
-hヘルプを表示する

型ライブラリが変更されることはめったにないため、このツールを手動で実行すれば(そしておそらく、生成されたファイルをバージョン管理システムでチェックすれば)、通常は十分である。型ライブラリが頻繁に変更される場合は、dumpcppqmake ビルド・システムに統合すればよい。.proファイルのTYPELIBS変数に、使用したい型ライブラリを列挙してください:

TEMPLATE = app
TARGET   = qutlook
QT += widgets axcontainer

TYPELIBS = $$system(dumpcpp -getfile {00062FFF-0000-0000-C000-000000000046})

生成された名前空間は、すべての列挙と、型ライブラリで宣言されたcoclassinterface ごとに1つのQAxObject サブクラスを宣言します。control 属性でマークされたコクラスは、QAxWidget サブクラスによってラップされます。

作成可能なコクラスをラップするこれらのクラス(つまり、noncreatable としてマークされていないコクラス)は、デフォルトのコンストラクタを持ちます。これは通常、Application 型の単一のクラスです。

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

それ以外のクラスは、IDispatchインターフェース・ポインターをコンストラクタに渡すことによってのみ作成できます。代わりに、すでに作成されているオブジェクトの適切なAPIを使用してください。

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

すべてのコクラス・ラッパーは、実装されたインターフェースごとにインターフェース・ラッパー・クラスを取るコンストラクターも1つ持っています。

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 ライブラリをビルドする必要があります。次に、tools/dumpcpp で make ツールを実行します。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。