次の方法で共有


CComEnum クラス

更新 : 2007 年 11 月

このクラスは、配列に基づいた COM 列挙子オブジェクトを定義します。

template <
   class Base,
   const IID* piid,
   class T,
   class Copy,
   class ThreadModel = CcomObjectThreadModel
>
class ATL_NO_VTABLE CComEnum :
      public CComEnumImpl<Base, piid, T, Copy>,
      public CComObjectRootEx< ThreadModel >

パラメータ

  • Base
    COM 列挙子 (IEnumXXXX) インターフェイス。

  • piid
    列挙子インターフェイスのインターフェイス ID へのポインタ。

  • T
    列挙子インターフェイスによって公開されるアイテムの型。

  • Copy
    同種のコピー ポリシー クラス

  • ThreadModel
    クラスのスレッド化モデル。このパラメータの既定値は、プロジェクトで使用するグローバル オブジェクトのスレッド化モデルです。

解説

CComEnum は、配列に基づいた COM 列挙子オブジェクトを定義します。このクラスは、STL コンテナに基づいて列挙子を実装する CComEnumOnSTL と類似しています。通常、このクラスは次の手順で使用します。詳細については、「ATL のコレクションと列挙子」を参照してください。

このクラスを使用するには、次の手順に従います。

  • このクラスから特化したクラスを typedef で定義します。

  • CComObject から特化したクラスで、typedef で定義したクラスをテンプレート パラメータとして使用します。

  • CComObject から特化したクラスのインスタンスを作成します。

  • CComEnumImpl::Init を呼び出し、列挙子オブジェクトを初期化します。

  • 列挙子インターフェイスをクライアントに返します。

必要条件

ヘッダー : atlcom.h

使用例

次のコードは、列挙子オブジェクトを作成および初期化するために再利用できる関数を提供します。

template <class EnumType, class ElementType>
HRESULT CreateEnumerator(IUnknown** ppUnk, ElementType* begin, ElementType* end,
   IUnknown* pUnk, CComEnumFlags flags)
{
   if (ppUnk == NULL)
      return E_POINTER;
   *ppUnk = NULL;

   CComObject<EnumType>* pEnum = NULL;
   HRESULT hr = CComObject<EnumType>::CreateInstance(&pEnum);

   if (FAILED(hr))
      return hr;

   hr = pEnum->Init(begin, end, pUnk, flags);

   if (SUCCEEDED(hr))
      hr = pEnum->QueryInterface(ppUnk);

   if (FAILED(hr))
      delete pEnum;

   return hr;
} // CreateEnumerator

このテンプレート関数を使用して、次に示すように、コレクション インターフェイスの _NewEnum プロパティを実装できます。

typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > VarArrEnum;

class ATL_NO_VTABLE CVariantArrayCollection :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CVariantArrayCollection, &CLSID_VariantArrayCollection>,
   public IDispatchImpl<IVariantArrayCollection, &IID_IVariantArrayCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
VARIANT m_arr[3];
public:
    STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
    {
        return CreateEnumerator<VarArrEnum>(ppUnk, &m_arr[0], &m_arr[3], this, 
           AtlFlagNoCopy);
    }

    // Remainder of class declaration omitted.

上記のコードは、IEnumVariant インターフェイスを通じて VARIANT 型のベクタを公開する CComEnum クラスを typedef で定義します。CVariantArrayCollection クラスは、定義した型の列挙子オブジェクトと一緒に動作するように CreateEnumerator を特化し、必要なパラメータを渡します。

参照

参照

CComObjectThreadModel

CComEnumImpl クラス

CComObjectRootEx クラス

その他の技術情報

CComEnum のメンバ

ATL クラスの概要