Compartir a través de


Clase CComEnumImpl

Esta clase proporciona la implementación de una interfaz de enumerador COM donde los elementos que se enumeran se almacenan en una matriz.

Sintaxis

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

Parámetros

Base
Una interfaz de enumerador COM. Consulte IEnumString para ver un ejemplo.

piid
Puntero al Id. de interfaz de la interfaz del enumerador.

T
El tipo de elemento expuesto por la interfaz del enumerador.

Copiar
Una clase de directiva de copia homogénea.

Miembros

Constructores públicos

Nombre Descripción
CComEnumImpl::CComEnumImpl Constructor .
CComEnumImpl::~CComEnumImpl El destructor .

Métodos públicos

Nombre Descripción
CComEnumImpl::Clone La implementación del método de interfaz de enumeración Clone.
CComEnumImpl::Init Inicializa el enumerador.
CComEnumImpl::Next La implementación de Next.
CComEnumImpl::Reset La implementación de Reset.
CComEnumImpl::Skip La implementación de Skip.

Miembros de datos públicos

Nombre Descripción
CComEnumImpl::m_begin Puntero al primer elemento de la matriz.
CComEnumImpl::m_dwFlags Copiar marcas pasadas a través de Init.
CComEnumImpl::m_end Puntero a la ubicación justo después del último elemento de la matriz.
CComEnumImpl::m_iter Puntero al elemento actual de la matriz.
CComEnumImpl::m_spUnk Puntero IUnknown del objeto que proporciona la colección que se está enumerando.

Comentarios

Consulte IEnumString para obtener un ejemplo de implementaciones de método. CComEnumImpl proporciona la implementación de una interfaz de enumerador COM, donde los elementos que se enumeran se almacenan en una matriz. Esta clase es análoga a la clase IEnumOnSTLImpl, que proporciona una implementación de una interfaz de enumerador basada en un contenedor de la biblioteca estándar de C++.

Nota:

Para más información sobre las diferencias adicionales entre CComEnumImpl y IEnumOnSTLImpl, consulte CComEnumImpl::Init.

Normalmente, no es necesario crear su propia clase de enumerador derivando de esta implementación de interfaz. Si desea usar un enumerador proporcionado por ATL y basado en una matriz, es más habitual crear una instancia de CComEnum.

Sin embargo, si necesita proporcionar un enumerador personalizado (por ejemplo, uno que expone interfaces, además de la interfaz del enumerador), puede derivar a partir de esta clase. En esta situación, es probable que tenga que invalidar el método CComEnumImpl::Clone para proporcionar su propia implementación.

Para más información, consulte Colecciones y enumeradores de ATL.

Jerarquía de herencia

Base

CComEnumImpl

Requisitos

Encabezado: atlcom.h

CComEnumImpl::CComEnumImpl

Constructor .

CComEnumImpl();

CComEnumImpl::~CComEnumImpl

El destructor .

~CComEnumImpl();

CComEnumImpl::Init

Debe llamar a este método antes de volver a pasar a los clientes un puntero dirigido a la interfaz del enumerador.

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

Parámetros

begin
Puntero al primer elemento de la matriz que contiene los elementos que se van a enumerar.

end
Puntero a la ubicación justo después del último elemento de la matriz que contiene los elementos que se van a enumerar.

pUnk
[in] Puntero IUnknown de un objeto que se debe mantener activo durante la vigencia del enumerador. Pase un valor NULL si no existe este objeto.

flags
Marcas que especifican si el enumerador debe convertirse en propietario de la matriz o copiarla. Los valores que pueden tener se describen más adelante.

Valor devuelto

Valor HRESULT estándar.

Comentarios

Llame a este método solo una vez. Inicialice el enumerador, úselo y después deséchelo.

Si pasa punteros a elementos de una matriz contenida en otro objeto (y no pide al enumerador que copie los datos), puede usar el parámetro pUnk para asegurarse de que el objeto y la matriz que contiene están disponibles siempre que el enumerador los necesite. El enumerador simplemente tiene una referencia COM en el objeto para mantenerla activa. La referencia COM se libera automáticamente cuando se destruye el enumerador.

El parámetro flags permite especificar cómo debe tratar el enumerador los elementos que le ha pasado la matriz. Las flags (marcas) pueden asumir uno de los valores de la enumeración CComEnumFlags que se muestran a continuación:

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

AtlFlagNoCopy significa que el enumerador no controla la duración de la matriz. En este caso, la matriz será estática o el objeto identificado por pUnk será responsable de liberar la matriz cuando ya no sea necesaria.

AtlFlagTakeOwnership significa que el enumerador controlará la destrucción de la matriz. En este caso, la matriz debe haberse asignado dinámicamente mediante new. El enumerador eliminará la matriz en su destructor. Normalmente, pasaría un valor NULL para pUnk, aunque todavía puede pasar un puntero válido si, por algún motivo, necesita recibir una notificación de la destrucción del enumerador.

AtlFlagCopy significa que se va a crear una nueva matriz mediante la copia de la matriz pasada a Init. El enumerador controlará la duración de la nueva matriz. El enumerador eliminará la matriz en su destructor. Normalmente, pasaría un valor NULL para pUnk, aunque todavía puede pasar un puntero válido si, por algún motivo, necesita recibir una notificación de la destrucción del enumerador.

Nota:

El prototipo de este método especifica los elementos de matriz como elementos de tipo T, donde T se definió como un parámetro de plantilla para la clase. Este es el mismo tipo que se expone mediante el método de interfaz COM CComEnumImpl::Next. La implicación de esto es que, a diferencia de IEnumOnSTLImpl, esta clase no admite distintos tipos de datos expuestos y de almacenamiento. El tipo de datos de los elementos de la matriz debe ser el mismo que el tipo de datos expuesto mediante la interfaz COM.

CComEnumImpl::Clone

Este método proporciona la implementación del método Clone mediante la creación de un objeto de tipo CComEnum, inicializándolo con la misma matriz e iterador usado por el objeto actual y devolviendo la interfaz en el objeto recién creado.

STDMETHOD(Clone)(Base** ppEnum);

Parámetros

ppEnum
[out] Interfaz del enumerador en un objeto recién creado y clonado desde el enumerador actual.

Valor devuelto

Valor HRESULT estándar.

Comentarios

Tenga en cuenta que los enumeradores clonados nunca realizan su propia copia (ni se convierten en propietarios) de los datos utilizados por el enumerador original. Si es necesario, los enumeradores clonados mantendrán activo el enumerador original (mediante una referencia COM) para garantizar que los datos estén disponibles siempre que los necesiten.

CComEnumImpl::m_spUnk

Este puntero inteligente mantiene una referencia en el objeto pasado a CComEnumImpl::Init para garantizar que permanece activo durante la vigencia del enumerador.

CComPtr<IUnknown> m_spUnk;

CComEnumImpl::m_begin

Puntero a la ubicación justo después del último elemento de la matriz que contiene los elementos que se van a enumerar.

T* m_begin;

CComEnumImpl::m_end

Puntero al primer elemento de la matriz que contiene los elementos que se van a enumerar.

T* m_end;

CComEnumImpl::m_iter

Puntero al elemento actual de la matriz que contiene los elementos que se van a enumerar.

T* m_iter;

CComEnumImpl::m_dwFlags

Las marcas pasadas a CComEnumImpl::Init.

DWORD m_dwFlags;

CComEnumImpl::Next

Este método proporciona la implementación del método Next.

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

Parámetros

celta
[in] Número de elementos solicitados.

rgelt
[out] Matriz que se va a rellenar con los elementos.

pceltFetched
[out] Número de elementos realmente devueltos en rgelt. Puede ser menor que celt si los que permanecieron en la lista son menos que los elementos indicados en celt.

Valor devuelto

Valor HRESULT estándar.

CComEnumImpl::Reset

Este método proporciona la implementación del método Reset.

STDMETHOD(Reset)(void);

Valor devuelto

Valor HRESULT estándar.

CComEnumImpl::Skip

Este método proporciona la implementación del método Skip.

STDMETHOD(Skip)(ULONG celt);

Parámetros

celta
[in] Número de elementos que se van a omitir.

Valor devuelto

Valor HRESULT estándar.

Comentarios

Devuelve E_INVALIDARG si celt es cero, devuelve S_FALSE si se devuelven menos elementos que los indicados en celt; de lo contrario, devuelve S_OK.

Consulte también

IEnumOnSTLImpl (clase)
CComEnum (clase)
Información general sobre la clase