Compartir a través de


Macros de COM_INTERFACE_ENTRY

Estas macros escriben las interfaces de un objeto en su asignación COM para que puedan acceder a ellas mediante QueryInterface. El orden de las entradas en la asignación COM es que las interfaces de orden se comprobarán si hay un IID coincidente durante QueryInterface.

Macro Descripción
COM_INTERFACE_ENTRY Escribe interfaces en la asignación de la interfaz COM.
COM_INTERFACE_ENTRY2 Use esta macro para eliminar la ambigüedad de dos ramas de herencia.
COM_INTERFACE_ENTRY_IID Use esta macro para escribir la interfaz en la asignación COM y especificar su IID.
COM_INTERFACE_ENTRY2_IID Igual que COM_INTERFACE_ENTRY2, excepto que puede especificar otro IID.
COM_INTERFACE_ENTRY_AGGREGATE Cuando se consulta la interfaz identificada por iid, COM_INTERFACE_ENTRY_AGGREGATE se desvía hacia punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND Igual que COM_INTERFACE_ENTRY_AGGREGATE, salvo que la consulta de cualquier IID da como resultado el desvío de la consulta hacia punk.
COM_INTERFACE_ENTRY_AUTOAGGREGATE Igual que COM_INTERFACE_ENTRY_AGGREGATE crea automáticamente el agregado descrito por el clsid, excepto si punk es NULL.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND Igual que COM_INTERFACE_ENTRY_AUTOAGGREGATE, salvo que la consulta de cualquier IID da como resultado el desvío de la consulta hacia punk y, si punk es NULL, se crea automáticamente el agregado descrito por el clsid.
COM_INTERFACE_ENTRY_BREAK Hace que el programa llame a DebugBreak cuando se consulta la interfaz especificada.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF Guarda los datos específicos de la interfaz para cada instancia.
COM_INTERFACE_ENTRY_TEAR_OFF Expone las interfaces de desplazamiento.
COM_INTERFACE_ENTRY_CHAIN Procesa la asignación COM de la clase base cuando el procesamiento alcanza esta entrada en la asignación COM.
COM_INTERFACE_ENTRY_FUNC Mecanismo general para enlazar a la lógica QueryInterface de ATL.
COM_INTERFACE_ENTRY_FUNC_BLIND Igual que COM_INTERFACE_ENTRY_FUNC, salvo que la consulta de cualquier IID da como resultado una llamada a func.
COM_INTERFACE_ENTRY_NOINTERFACE Devuelve E_NOINTERFACE y finaliza el procesamiento de asignaciones COM cuando se consulta la interfaz especificada.

Requisitos

Encabezado: atlcom.h

COM_INTERFACE_ENTRY

Escribe interfaces en la asignación de la interfaz COM.

Sintaxis

COM_INTERFACE_ENTRY( x )

Parámetros

x
[in] Nombre de una interfaz de la que deriva el objeto de clase directamente.

Comentarios

Normalmente, este es el tipo de entrada que se usa con más frecuencia.

Ejemplo

BEGIN_COM_MAP(CThisExample)
   COM_INTERFACE_ENTRY(IThisExample)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

Requisitos

Encabezado: atlcom.h

COM_INTERFACE_ENTRY2

Use esta macro para eliminar la ambigüedad de dos ramas de herencia.

COM_INTERFACE_ENTRY2(x, x2)

Parámetros

x
[in] Nombre de una interfaz que desea exponer desde el objeto.

x2
[in] Nombre de la rama de herencia desde la que se expone x.

Comentarios

Por ejemplo, si deriva el objeto de clase de dos interfaces duales, se expone IDispatch mediante COM_INTERFACE_ENTRY2 ya que IDispatch se puede obtener de cualquiera de las interfaces.

Ejemplo

class ATL_NO_VTABLE CEntry2Example :
   public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
   public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
   CEntry2Example()
   {
   }

BEGIN_COM_MAP(CEntry2Example)
   COM_INTERFACE_ENTRY(IEntry2Example)
   COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};

COM_INTERFACE_ENTRY_IID

Use esta macro para escribir la interfaz en la asignación COM y especificar su IID.

COM_INTERFACE_ENTRY_IID(iid, x)

Parámetros

iid
[in] GUID de la interfaz expuesta.

x
[in] Nombre de la clase cuya tabla virtual se expondrá como la interfaz identificada por iid.

Ejemplo

BEGIN_COM_MAP(CExample)
   COM_INTERFACE_ENTRY(IExample)
   COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
   COM_INTERFACE_ENTRY(IExampleBase)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

COM_INTERFACE_ENTRY2_IID

Igual que COM_INTERFACE_ENTRY2, excepto que puede especificar otro IID.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

Parámetros

iid
[in] GUID que se especifica para la interfaz.

x
[in] Nombre de una interfaz de la que deriva directamente el objeto de clase.

x2
[in] Nombre de una segunda interfaz de la que deriva directamente el objeto de clase.

COM_INTERFACE_ENTRY_AGGREGATE

Cuando se consulta la interfaz identificada por iid, COM_INTERFACE_ENTRY_AGGREGATE desvía hacia punk.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

Parámetros

iid
[in] GUID de la interfaz para la que se ha consultado.

punk
[in] Nombre de un puntero IUnknown.

Comentarios

Se supone que el parámetro punk apunta al desconocido interno de un agregado o a NULL, en cuyo caso se omite la entrada. Normalmente, usaría la función CoCreate para el agregado en FinalConstruct.

Ejemplo

BEGIN_COM_MAP(COuter1)
   COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

Igual que COM_INTERFACE_ENTRY_AGGREGATE, salvo que la consulta de cualquier IID da como resultado el desvío de la consulta hacia punk.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

Parámetros

punk
[in] Nombre de un puntero IUnknown.

Comentarios

Si se produce un error en la consulta de interfaz, el procesamiento de la asignación COM continúa.

Ejemplo

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

Igual que COM_INTERFACE_ENTRY_AGGREGATE crea automáticamente el agregado descrito por el clsid, excepto si punk es NULL.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

Parámetros

iid
[in] GUID de la interfaz para la que se ha consultado.

punk
[in] Nombre de un puntero IUnknown. Debe ser miembro de la clase que contiene la asignación COM.

clsid
[in] Identificador del agregado que se creará si punk es NULL.

Comentarios

Ejemplo

BEGIN_COM_MAP(COuter3)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

Igual que COM_INTERFACE_ENTRY_AUTOAGGREGATE, salvo que la consulta de cualquier IID da como resultado el desvío de la consulta hacia punk y, si punk es NULL, se crea automáticamente el agregado descrito por el clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

Parámetros

punk
[in] Nombre de un puntero IUnknown. Debe ser miembro de la clase que contiene la asignación COM.

clsid
[in] Identificador del agregado que se creará si punk es NULL.

Comentarios

Si se produce un error en la consulta de interfaz, el procesamiento de la asignación COM continúa.

Ejemplo

BEGIN_COM_MAP(COuter4)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()

COM_INTERFACE_ENTRY_BREAK

Hace que el programa llame a DebugBreak cuando se consulta la interfaz especificada.

COM_INTERFACE_ENTRY_BREAK(x)

Parámetros

x
[in] Texto usado para construir el identificador de interfaz.

Comentarios

La interfaz IID se construirá anexando x a IID_. Por ejemplo, si x es IPersistStorage, el IID será IID_IPersistStorage.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

Guarda los datos específicos de la interfaz para cada instancia.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

Parámetros

iid
[in] GUID de la interfaz de desplazamiento.

x
[in] Nombre completo de la clase que implementa la interfaz.

punk
[in] Nombre de un puntero IUnknown. Debe ser miembro de la clase que contiene la asignación COM. Debe inicializarse en NULL en el constructor del objeto de clase.

Comentarios

Si no se usa la interfaz, reduce el tamaño total de la instancia del objeto.

Ejemplo

BEGIN_COM_MAP(COuter)
   COM_INTERFACE_ENTRY(IOuter)
   COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()

COM_INTERFACE_ENTRY_TEAR_OFF

Expone las interfaces de desplazamiento.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

Parámetros

iid
[in] GUID de la interfaz de desplazamiento.

x
[in] Nombre completo de la clase que implementa la interfaz.

Comentarios

Una interfaz de desplazamiento se implementa como un objeto independiente al que se crea una instancia cada vez que se consulta la interfaz para la que representa. Normalmente, se crea la interfaz como un desplazamiento si la interfaz no se suele usar, ya que esto guarda un puntero de tabla virtual en cada instancia del objeto principal. El desplazamiento se elimina cuando el recuento de referencias se convierte en cero. La clase que implementa el desplazamiento debe derivarse de CComTearOffObjectBase y tener su propia asignación COM.

Ejemplo

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

COM_INTERFACE_ENTRY_CHAIN

Procesa la asignación COM de la clase base cuando el procesamiento alcanza esta entrada en la asignación COM.

COM_INTERFACE_ENTRY_CHAIN(classname)

Parámetros

classname
[in] Clase base del objeto actual.

Comentarios

Por ejemplo, en el código siguiente:

BEGIN_COM_MAP(COuterObject)
   COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

Tenga en cuenta que la primera entrada de la asignación COM debe ser una interfaz en el objeto que contiene la asignación COM. Por lo tanto, no puede iniciar las entradas de la asignación COM con COM_INTERFACE_ENTRY_CHAIN, lo que hace que se busque en la asignación COM de un objeto diferente en el punto en el que COM_INTERFACE_ENTRY_CHAIN(COtherObject) aparece en la asignación COM del objeto. Si desea buscar primero en la asignación COM de otro objeto, agregue una entrada de interfaz para IUnknown a su asignación COM y encadene la asignación COM del otro objeto. Por ejemplo:

BEGIN_COM_MAP(CThisObject)
   COM_INTERFACE_ENTRY(IUnknown)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM_INTERFACE_ENTRY_FUNC

Mecanismo general para enlazar a la lógica QueryInterface de ATL.

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

Parámetros

iid
[in] GUID de la interfaz expuesta.

dw
[in] Parámetro pasado a func.

func
[in] Puntero de función que devolverá iid.

Comentarios

Si iid coincide con el IID de la interfaz para la que se consulta, se llama a la función especificada mediante func. La declaración de la función debe ser la siguiente:

HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);

Cuando se llama a la función, pv apunta a su objeto de clase. El parámetro riid hace referencia a la interfaz para la que se consulta, ppv es el puntero a la ubicación donde la función debe almacenar el puntero a la interfaz y dw es el parámetro que especificó en la entrada. La función debe establecer * ppv en NULL y devolver E_NOINTERFACE o S_FALSE si decide no devolver una interfaz. Con E_NOINTERFACE, finaliza el procesamiento de asignaciones COM. Con S_FALSE, el procesamiento de asignaciones COM continúa, aunque no se devolvió ningún puntero de interfaz. Si la función devuelve un puntero de interfaz, debe devolver S_OK.

COM_INTERFACE_ENTRY_FUNC_BLIND

Igual que COM_INTERFACE_ENTRY_FUNC, salvo que la consulta de cualquier IID da como resultado una llamada a func.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

Parámetros

dw
[in] Parámetro pasado a func.

func
[in] Función a la que se llama cuando se procesa esta entrada en la asignación COM.

Comentarios

Cualquier error hará que el procesamiento continúe en la asignación COM. Si la función devuelve un puntero de interfaz, debe devolver S_OK.

COM_INTERFACE_ENTRY_NOINTERFACE

Devuelve E_NOINTERFACE y finaliza el procesamiento de asignaciones COM cuando se consulta la interfaz especificada.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

Parámetros

x
[in] Texto usado para construir el identificador de interfaz.

Comentarios

Puede usar esta macro para evitar que se use una interfaz en un caso determinado. Por ejemplo, puede insertar esta macro en la asignación COM justo antes de COM_INTERFACE_ENTRY_AGGREGATE_BLIND para evitar que una consulta de la interfaz se reenvíe al elemento interno desconocido del agregado.

La interfaz IID se construirá anexando x a IID_. Por ejemplo, si x es IPersistStorage, el IID será IID_IPersistStorage.