次の方法で共有


CComEnumOnSTL クラス

更新 : 2007 年 11 月

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

template <
   class Base,
   const IID* piid,
   class T,
   class Copy,
   class CollType,
   class ThreadModel = CComObjectThreadModel
>
class ATL_NO_VTABLE CComEnumOnSTL :
   public IEnumOnSTLImpl<Base, piid, T, Copy, CollType>,
   public CComObjectRootEx< ThreadModel >

パラメータ

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

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

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

  • Copy
    コピー ポリシー クラス。

  • CollType
    STL コンテナ クラス。

解説

CComEnumOnSTL は、STL コレクションに基づく COM 列挙子オブジェクトを定義します。このクラスは、単独でまたは ICollectionOnSTLImpl と組み合わせて使用できます。通常、このクラスは次の手順で使用します。詳細については、「ATL のコレクションと列挙子」を参照してください。

このクラスを ICollectionOnSTLImpl と組み合わせて使用するには

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

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

使用例については、「ATL のコレクションと列挙子」を参照してください。

このクラスを ICollectionOnSTLImpl と関係なく単独で使用するには

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

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

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

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

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

必要条件

ヘッダー : atlcom.h

使用例

次に示すコードは、列挙子オブジェクトの作成や初期化を処理するジェネリック関数を提供します。

template <class EnumType, class CollType>
HRESULT CreateSTLEnumerator(IUnknown** ppUnk, IUnknown* pUnkForRelease, 
   CollType& collection)
{
   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(pUnkForRelease, collection);

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

   if (FAILED(hr))
      delete pEnum;

   return hr;
} // CreateSTLEnumerator

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

typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT>,
   std::vector<CComVariant> > VarVarEnum;

class ATL_NO_VTABLE CVariantCollection :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CVariantCollection, &CLSID_VariantCollection>,
   public IDispatchImpl<IVariantCollection, &IID_IVariantCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   std::vector<CComVariant> m_vec;

   STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
   {
      return CreateSTLEnumerator<VarVarEnum>(ppUnk, this, m_vec);
   }

   // Remainder of class declaration omitted.

このコードは、IEnumVariant インターフェイスを通じて CComVariant 型のベクタを公開する CComEnumOnSTL クラスを typedef で定義します。CVariantCollection クラスは、この型の列挙子オブジェクトと一緒に動作するように CreateSTLEnumerator を特化します。

参照

処理手順

ATLCollections サンプル : ICollectionOnSTLImpl、CComEnumOnSTL、およびカスタム コピー ポリシーの各クラスの例

参照

CComObjectRootEx クラス

CComObjectThreadModel

IEnumOnSTLImpl クラス

その他の技術情報

CComEnumOnSTL のメンバ

ATL クラスの概要