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
.