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