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 を特化し、必要なパラメータを渡します。