次の方法で共有


ATL COM オブジェクトの基礎

次の図は、ATL COM オブジェクトの定義に使用されるクラスとインターフェイス間の関係を示しています。

A T L オブジェクトの定義に使用されるクラスとインターフェイスの図。

Note

この図は、CComObjectCYourClass から派生しているのに対して、CComAggObjectCComPolyObject にはメンバー変数として CYourClass が含まれていることを示しています。

ATL COM オブジェクトを定義する方法は、3 つあります。 標準的なオプションは、CYourClass から派生している CComObject クラスを使用します。 2 番目のオプションは、CComAggObject クラスを使用して集約されたオブジェクトを作成します。 3 番目のオプションは、CComPolyObject を使用します。 CComPolyObject は、ハイブリッドとして動作します。最初に作成された方法によって、CComObject クラスまたは CComAggObject クラスとして機能できます。 CComPolyObject クラスの使用方法の詳細については、「CComPolyObject クラス」を参照してください。

標準 ATL COM を使用する場合は、外側のオブジェクトと内部オブジェクトの 2 つのオブジェクトを使用します。 外部クライアントは、外部オブジェクトで定義されているラッパー関数を介して、内部オブジェクトの機能にアクセスします。 外部オブジェクトのタイプは、CComObject です。

集約されたオブジェクトを使用する場合、外側のオブジェクトは内部オブジェクトの機能のラッパーを提供しません。 代わりに、外部オブジェクトは、外部クライアントから直接アクセスされるポインターを提供します。 このシナリオでは、外部オブジェクトのタイプは CComAggObject です。 内部オブジェクトは、外部オブジェクトのメンバー変数で、タイプは CYourClass です。

クライアントは内部オブジェクトとやりとりするために外部オブジェクトを通過する必要はないので、通常、集約されたオブジェクトの方が効率的です。 また、集約されたオブジェクトのインターフェイスをクライアントで直接使用できる場合、集約されたオブジェクトの機能を外部オブジェクトで認識する必要はありません。 ただし、すべてのオブジェクトが集約できるわけではありません。 オブジェクトを集約するには、集約を念頭に置いて設計する必要があります。

ATL により IUnknown は 2 つのフェーズで実装されます。

ATL COM オブジェクトのその他の側面は、他のクラスによって処理されます。

  • CComCoClass によりオブジェクトの既定のクラス ファクトリと集約モデルが定義されます。

  • IDispatchImpl により、オブジェクト上のすべてのデュアル インターフェイスの IDispatch Interface 部分の既定の実装が提供されます。

  • ISupportErrorInfoImpl により、エラー情報を呼び出しチェーンの上位に確実に正しく伝達する ISupportErrorInfo インターフェイスが実装されます。

このセクションの内容

CComObjectRootEx の実装
CComObjectRootEx を実装する COM マップ エントリの例を示します。

CComObject、CComAggObject、CComPolyObject の実装
DECLARE_*_AGGREGATABLE マクロが CComObjectCComAggObjectCComPolyObject の使用に影響する仕組みについて説明します。

IDispatch と IErrorInfo のサポート
IDispatchIErrorInfo インターフェイスをサポートするために使用する ATL 実装クラスを一覧表示します。

IDispEventImpl のサポート
クラスのコネクション ポイントを実装する手順について説明します。

既定のクラス ファクトリと集計モデルの変更
既定のクラス ファクトリと集約モデルを変更するために使用するマクロを表示します。

集計オブジェクトの作成
集約されたオブジェクトを作成する手順の一覧を示します。

ATL プロジェクトの作成
ATL COM オブジェクトの作成に関する情報を提供します。

ATL
Active Template Library を使用してプログラミングする方法に関する概念説明のトピックへのリンクを提供します。

関連項目

概念