Classe de CComEnum
Cette classe définit un objet énumérateur COM selon un tableau.
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 >
Paramètres
Base
Une interface d'énumérateur COM (IEnumXXXX).piid
Pointeur vers l'ID d'interface de l'interface d'énumérateur.T
Le type d'élément exposé par l'interface d'énumérateur.Copy
classe de stratégie de copiehomogène.ThreadModel
Le modèle de thread de la classe.Ce paramètre a la valeur par défaut au modèle de thread global d'objet utilisé dans votre projet.
Notes
CComEnum définit un objet énumérateur COM selon un tableau.Cette classe est analogue à CComEnumOnSTL qui implémente un énumérateur sur un conteneur STL.Les étapes standard pour l'utilisation de cette classe sont dessinées les grandes lignes ci-dessous.Pour plus d'informations, consultez Collections et énumérateurs ATL.
Pour utiliser cette classe :
typedef une spécialisation de cette classe.
Utilisez typedef comme argument template dans une spécialisation d' CComObject.
Créez une instance de la spécialisation d' CComObject .
Initialisez l'objet énumérateur en appelant CComEnumImpl::Init.
Retourne l'interface de l'énumérateur au client.
Hiérarchie d'héritage
CComObjectRootBase
Base
CComEnum
Configuration requise
Header: atlcom.h
Exemple
Le code indiqué ci-dessous fournit une fonction réutilisable pour créer et initialiser un objet énumérateur.
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
Cette fonction de modèle peut être utilisée pour implémenter la propriété d' _NewEnum d'une interface de collection comme indiqué ci-dessous :
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.
Ce code crée typedef pour CComEnum qui expose un vecteur de variants via l'interface d' IEnumVariant .La classe de CVariantArrayCollection spécialise simplement CreateEnumerator pour utiliser les objets énumérateurs de ce type et passe les arguments nécessaires.