ATL COM オブジェクトの基本事項
次の図は、ATL COM オブジェクトの定義に使用するクラスとインターフェイスとの関係を示しています。
[!メモ]
この図は、CComObject が CYourClass から派生し、CComAggObject および CComPolyObject に CYourClass がメンバー変数として含まれていることを示しています。
ATL COM オブジェクトを定義するには、3 とおりの方法があります。標準的な方法は、CYourClass から派生する CComObject クラスを使用する方法です。2 つ目は、CComAggObject クラスを使用して集約オブジェクトを作成する方法です。3 つ目は、CComPolyObject クラスを使用する方法です。CComPolyObject はハイブリッドとして動作します。つまり、最初に作成された方法に応じて、CComObject クラスまたは CComAggObject クラスとして機能します。CComPolyObject クラスの使用方法の詳細については、「CComPolyObject クラス」を参照してください。
標準 ATL COM を使用する場合は、外部オブジェクトと内部オブジェクトの 2 つのオブジェクトを使用します。外部クライアントは、外部オブジェクトで定義されたラッパー関数を通じて内部オブジェクトの機能にアクセスします。外部オブジェクトの型は CComObject です。
集約オブジェクトを使用する場合、外部オブジェクトは、内部オブジェクトの機能に対するラッパーを提供しません。代わりに、外部オブジェクトは、外部クライアントによって直接アクセスされるポインターを提供します。このシナリオでは、外部オブジェクトの型は CComAggObject です。内部オブジェクトは、外部オブジェクトのメンバー変数であり、その型は CYourClass です。
クライアントは内部オブジェクトと対話する際に外部オブジェクトを経由する必要がないため、通常は集約オブジェクトの方が効率的です。また、集約オブジェクトのインターフェイスがクライアントから直接使用可能であれば、外部オブジェクトは集約オブジェクトの機能を認識する必要がありません。ただし、すべてのオブジェクトを集約できるとは限りません。オブジェクトを集約するには、そのオブジェクトが集約を考慮してデザインされている必要があります。
ATL は、次の 2 段階で IUnknown を実装します。
CComObject、CComAggObject、または CComPolyObject が、IUnknown メソッドを実装します。
CComObjectRoot または CComObjectRootEx が、IUnknown の参照カウントと外部ポインターを管理します。
ATL COM オブジェクトのその他の部分は、ほかのクラスで処理します。
CComCoClass は、オブジェクトの既定のクラス ファクトリと集約モデルを定義します。
IDispatchImpl は、オブジェクトのデュアル インターフェイスの IDispatch Interface 部分について、既定の実装を用意します。
ISupportErrorInfoImpl は、エラー情報が正しく呼び出しチェイン上に反映されるか確認する ISupportErrorInfo インターフェイスを実装します。
このセクションの内容
CComObjectRootEx の実装
CComObjectRootEx を実装するための COM マップ エントリの例を示します。CComObject、CComAggObject、および CComPolyObject の実装
DECLARE_*_AGGREGATABLE マクロが CComObject、CComAggObject、および CComPolyObject にどのように影響するかについて説明します。IDispatch と IErrorInfo のサポート
IDispatch インターフェイスと IErrorInfo インターフェイスのサポートに使用する ATL 実装クラスを示します。IDispEventImpl のサポート
クラスに対するコネクション ポイントの実装手順について示します。既定のクラス ファクトリと集約モデルの変更
既定のクラス ファクトリおよび集約モデルの変更に使用するマクロを示します。集約オブジェクトの作成
集約オブジェクトの作成手順を示します。
関連項目
ATL プロジェクトの作成
ATL COM オブジェクトの作成に関する情報を提供します。ATL
Active Template Library を使用したプログラミングの概念を説明するトピックへのリンクを示します。