Classe CComEnumImpl

Questa classe fornisce l'implementazione per un'interfaccia dell'enumeratore COM in cui gli elementi enumerati vengono archiviati in una matrice.

Sintassi

template <class Base,
    const IID* piid, class T, class Copy>
class ATL_NO_VTABLE CComEnumImpl : public Base

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.

Membri

Costruttori pubblici

Nome Descrizione
CComEnumImpl::CComEnumImpl Costruttore.
CComEnumImpl::~CComEnumImpl Distruttore.

Metodi pubblici

Nome Descrizione
CComEnumImpl::Clone Implementazione del metodo di interfaccia di enumerazione Clone .
CComEnumImpl::Init Inizializza l'enumeratore.
CComEnumImpl::Next Implementazione di Next.
CComEnumImpl::Reset Implementazione di Reset.
CComEnumImpl::Skip Implementazione di Skip.

Membri dati pubblici

Nome Descrizione
CComEnumImpl::m_begin Puntatore al primo elemento della matrice.
CComEnumImpl::m_dwFlags Flag di copia passati tramite Init.
CComEnumImpl::m_end Puntatore alla posizione immediatamente successiva all'ultimo elemento della matrice.
CComEnumImpl::m_iter Puntatore all'elemento corrente nella matrice.
CComEnumImpl::m_spUnk Puntatore IUnknown dell'oggetto che fornisce l'insieme da enumerare.

Osservazioni:

Per un esempio di implementazioni del metodo, vedere IEnumString . CComEnumImpl fornisce l'implementazione per un'interfaccia dell'enumeratore COM in cui gli elementi enumerati vengono archiviati in una matrice. Questa classe è analoga alla IEnumOnSTLImpl classe , che fornisce un'implementazione di un'interfaccia enumeratore basata su un contenitore della libreria standard C++.

Nota

Per informazioni dettagliate sulle altre differenze tra CComEnumImpl e , vedere CComEnumImpl::InitIEnumOnSTLImpl.

In genere, non sarà necessario creare una classe enumeratore personalizzata derivando da questa implementazione dell'interfaccia. Se si vuole usare un enumeratore fornito da ATL basato su una matrice, è più comune creare un'istanza di CComEnum.

Tuttavia, se è necessario fornire un enumeratore personalizzato (ad esempio, uno che espone interfacce oltre all'interfaccia dell'enumeratore), è possibile derivare da questa classe. In questa situazione, è probabile che sia necessario eseguire l'override del metodo CComEnumImpl::Clone per fornire la propria implementazione.

Per altre informazioni, vedere Raccolte e enumeratori ATL.

Gerarchia di ereditarietà

Base

CComEnumImpl

Requisiti

Intestazione: atlcom.h

CComEnumImpl::CComEnumImpl

Costruttore.

CComEnumImpl();

CComEnumImpl::~CComEnumImpl

Distruttore.

~CComEnumImpl();

CComEnumImpl::Init

È necessario chiamare questo metodo prima di passare un puntatore all'interfaccia dell'enumeratore a tutti i client.

HRESULT Init(
    T* begin,
    T* end,
    IUnknown* pUnk,
    CComEnumFlags flags = AtlFlagNoCopy);

Parametri

begin
Puntatore al primo elemento della matrice contenente gli elementi da enumerare.

end
Puntatore alla posizione immediatamente successiva all'ultimo elemento della matrice contenente gli elementi da enumerare.

Punk
[in] Puntatore IUnknown di un oggetto che deve essere mantenuto attivo durante la durata dell'enumeratore. Passare NULL se non esiste alcun oggetto di questo tipo.

flags
Flag che specificano se l'enumeratore deve assumere la proprietà della matrice o crearne una copia. I valori possibili sono descritti di seguito.

Valore restituito

Valore HRESULT standard.

Osservazioni:

Chiamare questo metodo una sola volta: inizializzare l'enumeratore, usarlo e quindi eliminarlo.

Se si passano puntatori a elementi in una matrice contenuta in un altro oggetto (e non si chiede all'enumeratore di copiare i dati), è possibile usare il parametro pUnk per assicurarsi che l'oggetto e la matrice che contiene siano disponibili per tutto il tempo necessario all'enumeratore. L'enumeratore contiene semplicemente un riferimento COM sull'oggetto per mantenerlo attivo. Il riferimento COM viene rilasciato automaticamente quando l'enumeratore viene eliminato definitivamente.

Il parametro flags consente di specificare il modo in cui l'enumeratore deve trattare gli elementi della matrice passati. I flag possono accettare uno dei valori dell'enumerazione CComEnumFlags illustrata di seguito:

enum CComEnumFlags
   {
   AtlFlagNoCopy = 0,
   AtlFlagTakeOwnership = 2, // BitOwn
   AtlFlagCopy = 3           // BitOwn | BitCopy
   };

AtlFlagNoCopy significa che la durata della matrice non è controllata dall'enumeratore. In questo caso, la matrice sarà statica o l'oggetto identificato da pUnk sarà responsabile della liberazione della matrice quando non è più necessario.

AtlFlagTakeOwnership significa che la distruzione della matrice deve essere controllata dall'enumeratore. In questo caso, la matrice deve essere stata allocata dinamicamente usando new. L'enumeratore eliminerà la matrice nel distruttore. In genere, si passa NULL per pUnk, anche se è comunque possibile passare un puntatore valido se è necessario ricevere una notifica della distruzione dell'enumeratore per qualche motivo.

AtlFlagCopy significa che una nuova matrice deve essere creata copiando la matrice passata a Init. La durata della nuova matrice deve essere controllata dall'enumeratore. L'enumeratore eliminerà la matrice nel distruttore. In genere, si passa NULL per pUnk, anche se è comunque possibile passare un puntatore valido se è necessario ricevere una notifica della distruzione dell'enumeratore per qualche motivo.

Nota

Il prototipo di questo metodo specifica gli elementi della matrice come di tipo T, dove T è stato definito come parametro di modello per la classe . Si tratta dello stesso tipo esposto tramite il metodo di interfaccia COM CComEnumImpl::Next. L'implicazione di questo è che, a differenza di IEnumOnSTLImpl, questa classe non supporta diversi tipi di archiviazione ed esposti. Il tipo di dati degli elementi nella matrice deve essere uguale al tipo di dati esposto tramite l'interfaccia COM.

CComEnumImpl::Clone

Questo metodo fornisce l'implementazione del metodo Clone creando un oggetto di tipo CComEnum, inizializzandolo con la stessa matrice e iteratore usato dall'oggetto corrente e restituendo l'interfaccia sull'oggetto appena creato.

STDMETHOD(Clone)(Base** ppEnum);

Parametri

ppEnum
[out] Interfaccia dell'enumeratore in un oggetto appena creato clonato dall'enumeratore corrente.

Valore restituito

Valore HRESULT standard.

Osservazioni:

Si noti che gli enumeratori clonati non effettuano mai la propria copia (o prendono la proprietà) dei dati usati dall'enumeratore originale. Se necessario, gli enumeratori clonati manterranno attivo l'enumeratore originale (usando un riferimento COM) per assicurarsi che i dati siano disponibili per tutto il tempo necessario.

CComEnumImpl::m_spUnk

Questo puntatore intelligente mantiene un riferimento sull'oggetto passato a CComEnumImpl::Init, assicurandosi che rimanga attivo durante la durata dell'enumeratore.

CComPtr<IUnknown> m_spUnk;

CComEnumImpl::m_begin

Puntatore alla posizione immediatamente successiva all'ultimo elemento della matrice contenente gli elementi da enumerare.

T* m_begin;

CComEnumImpl::m_end

Puntatore al primo elemento della matrice contenente gli elementi da enumerare.

T* m_end;

CComEnumImpl::m_iter

Puntatore all'elemento corrente della matrice contenente gli elementi da enumerare.

T* m_iter;

CComEnumImpl::m_dwFlags

Flag passati a CComEnumImpl::Init.

DWORD m_dwFlags;

CComEnumImpl::Next

Questo metodo fornisce l'implementazione del metodo Next .

STDMETHOD(Next)(ULONG celt, T* rgelt, ULONG* pceltFetched);

Parametri

celta
[in] Numero di elementi richiesti.

rgelt
[out] Matrice da riempire con gli elementi.

pceltFetched
[out] Numero di elementi effettivamente restituiti in rgelt. Può essere minore di celt se nell'elenco rimangono meno di elementi celt .

Valore restituito

Valore HRESULT standard.

CComEnumImpl::Reset

Questo metodo fornisce l'implementazione del metodo Reset .

STDMETHOD(Reset)(void);

Valore restituito

Valore HRESULT standard.

CComEnumImpl::Skip

Questo metodo fornisce l'implementazione del metodo Skip .

STDMETHOD(Skip)(ULONG celt);

Parametri

celta
[in] Numero di elementi da ignorare.

Valore restituito

Valore HRESULT standard.

Osservazioni:

Restituisce E_INVALIDARG se celt è zero, restituisce S_FALSE se vengono restituiti elementi meno di celt , restituisce S_OK in caso contrario.

Vedi anche

Classe IEnumOnSTLImpl
Classe CComEnum
Cenni preliminari sulla classe