次の方法で共有


CComEnum クラス

このクラスを使用すると、配列に基づき、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 列挙子インターフェイス。 例については、IEnumString に関する記事を参照してください。

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

T
列挙子インターフェイスによって公開される項目の型。

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

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

解説

CComEnum を使用すると、配列に基づき、COM 列挙子オブジェクトを定義することができます。 このクラスは、C++ 標準ライブラリ コンテナーに基づき列挙子インターフェイスを実装する CComEnumOnSTL に似ています。 このクラスを使うための一般的な手順を次に示します。 詳細については、「ATL コレクションと列挙子」を参照してください。

このクラスを使用するには、次のようにします。

  • このクラスの特殊化に typedef を使用します。

  • CComObject の特殊化でテンプレート引数としてその typedef を使います。

  • CComObject 特殊化のインスタンスを作成します。

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

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

継承階層

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

要件

ヘッダー: 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 のベクターを公開する typedefCComEnum を作成できます。 CVariantArrayCollection クラスを使用すると、この型の列挙子オブジェクトを操作できるように CreateEnumerator を単純に特殊化できることに加え、必要な引数を渡すことができます。

関連項目

クラスの概要
CComObjectThreadModel
CComEnumImpl クラス
CComObjectRootEx クラス