[VC60] ATL で COM オブジェクトをアグリゲートする方法

文書翻訳 文書翻訳
文書番号: 173823 - 対象製品
この記事は、以前は次の ID で公開されていました: JP173823
すべて展開する | すべて折りたたむ

目次

概要

この資料では、ATL プロジェクトの COM オブジェクトをアグリゲートする方法について紹介します。

アグリゲートの手順は以下のとおりです。
  1. クラス オブジェクトに IUnknown ポインタを追加し、コンストラクタで NULL に初期化します。
  2. DECLARE_PROTECT_FINAL_CONSTRUCT マクロを追加して、(FinalConstruct の中に) 内部アグリゲート オブジェクトが参照カウントをインクリメントした後で、デクリメントして 0 になった場合に、オブジェクトが削除されないように保護します。
  3. COM_INTERFACE_ENTRY_AGGREGATE マクロに第 2 パラメータとして定義した IUnknown ポインタを使用します。第 1 パラメータは、エクスポーズしたいインナー オブジェクトのインターフェイス IID です。
  4. FinalConstruct() をオーバーライドして、アグリゲートを作成します。
  5. FinalRelease() をオーバーライドして、IUnknown ポインタを開放します。

詳細

FinalConstruct の処理中に、インターフェイスをグループから開放する場合は、クラス オブジェクトの定義に、DECLARE_PROTECT_FINAL_CONSTRUCT マクロを追加する必要があります。

以下のサンプル コードでは、クラス定義で行う 4 手順すべてを示しています。このオブジェクトは、COutObj というシンプルなオブジェクトで、別なオブジェクト CInnObj をアグリゲートします。

サンプル コード

      class ATL_NO_VTABLE COutObj :
            public CComObjectRootEx<CComSingleThreadModel>,
            public CComCoClass<COutObj, &CLSID_OutObj>,
            public IDispatchImpl<IOutObj, &IID_IOutObj, &LIBID_OUTEROBJLib>
      {
      public:
         COutObj() : m_pInnerUnk(NULL) // 手順 1
         {
         }
         DECLARE_GET_CONTROLLING_UNKNOWN()
         DECLARE_REGISTRY_RESOURCEID(IDR_OUTOBJ)
         DECLARE_PROTECT_FINAL_CONSTRUCT() // 手順 2

         BEGIN_COM_MAP(COutObj)
            COM_INTERFACE_ENTRY(IOutObj)
            COM_INTERFACE_ENTRY(IDispatch)
            COM_INTERFACE_ENTRY_AGGREGATE(IID_IInnObj, m_pInnerUnk) // 手順 3
         END_COM_MAP()

         // 手順 4 の開始
         HRESULT FinalConstruct()
         {
            HRESULT hr;
            CLSID   clsidInner;

            hr = CLSIDFromProgID(L"InnObj.InnObj.1", &clsidInner);
            if (hr == S_OK)
               hr = CoCreateInstance(clsidInner, GetControllingUnknown(),
                                     CLSCTX_INPROC_SERVER, IID_IUnknown,
                                     (void**)&m_pInnerUnk);
            return hr;
         } // 手順 4 の終了

         void FinalRelease(){m_pInnerUnk->Release();} // 手順 5

         // IOutObj
      public:
         STDMETHOD(Test)();
      private:
         LPUNKNOWN m_pInnerUnk; // 手順 1
      };
インナー オブジェクトが同一の ATL サーバーにある場合、CoCreateInstance を使わずに次のコードを使って、インナー オブジェクトを作成してください。
      HRESULT FinalConstruct()
         {
            return  CInnObj::_CreatorClass::CreateInstance(
                GetControllingUnknown(), IID_IUnknown,
                (void**)&m_pInnerUnk);

         }

関連情報

- Visual C++ ユーザーズガイド
 - リファレンス
  - Microsoft Foundation Classes リファレンス
  - C/C++ Language and C++ Library
   - ATL (Active Template Library)
    - 解説
     - COM および ATL 入門
      - COM 入門
       - アグリゲーション

- Visual C++ ユーザーズガイド
 - リファレンス
  - Microsoft Foundation Classes リファレンス
  - C/C++ Language and C++ Library
   - ATL (Active Template Library)
    - 解説
     - ATL COM オブジェクトの基本
      - アグリゲートを作成する

  (C) Microsoft Corporation 1997, All Rights Reserved.
      Contributions by Chuck Bell, Microsoft Corporation.

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 173823 (最終更新日 2000-06-01) をもとに作成したものです。

プロパティ

文書番号: 173823 - 最終更新日: 2003年6月17日 - リビジョン: 2.2
この資料は以下の製品について記述したものです。
  • Microsoft ActiveX Template Library 2.1?を以下の環境でお使いの場合
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
  • Microsoft ActiveX Template Library 3.0?を以下の環境でお使いの場合
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
キーワード:?
aggregate kbinfo KB173823
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com