Condividi tramite


Classe CComEnum

Questa classe definisce un oggetto enumeratore COM basato su una matrice.

Sintassi

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>

Parametri

Base
Interfaccia dell'enumeratore COM. Per un esempio, vedere IEnumString .

piid
Puntatore all'ID interfaccia dell'interfaccia dell'enumeratore.

T
Tipo di elemento esposto dall'interfaccia dell'enumeratore.

Copia
Classe di criteri di copia omogenea.

ThreadModel
Modello di threading della classe . Per impostazione predefinita, questo parametro corrisponde al modello di thread a oggetti globale usato nel progetto.

Osservazioni:

CComEnum definisce un oggetto enumeratore COM basato su una matrice. Questa classe è analoga a CComEnumOnSTL che implementa un enumeratore basato su un contenitore della libreria standard C++. Di seguito sono descritti i passaggi tipici per l'uso di questa classe. Per altre informazioni, vedere Raccolte e enumeratori ATL.

Per usare questa classe:

  • typedef una specializzazione di questa classe.

  • typedef Usare come argomento modello in una specializzazione di CComObject.

  • Creare un'istanza della CComObject specializzazione.

  • Inizializzare l'oggetto enumeratore chiamando CComEnumImpl::Init.

  • Restituire l'interfaccia dell'enumeratore al client.

Gerarchia di ereditarietà

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Requisiti

Intestazione: atlcom.h

Esempio

Il codice illustrato di seguito fornisce una funzione riutilizzabile per la creazione e l'inizializzazione di un oggetto enumeratore.

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

Questo modello di funzione può essere usato per implementare la proprietà di un'interfaccia _NewEnum di raccolta, come illustrato di seguito:

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.

Questo codice crea un typedef oggetto per CComEnum che espone un vettore di VARIANT tramite l'interfaccia IEnumVariant . La CVariantArrayCollection classe è semplicemente specializzata CreateEnumerator per lavorare con gli oggetti enumeratore di questo tipo e passa gli argomenti necessari.

Vedi anche

Cenni preliminari sulla classe
CComObjectThreadModel
Classe CComEnumImpl
Classe CComObjectRootEx