Macros COM_INTERFACE_ENTRY

Essas macros inserem as interfaces de um objeto em seu mapa COM para que possam ser acessadas por QueryInterface. A ordem das entradas no mapa COM é a ordem em que as interfaces de pedido serão verificadas para um IID correspondente durante QueryInterface.

Macro Descrição
COM_INTERFACE_ENTRY Insere interfaces no mapa da interface COM.
COM_INTERFACE_ENTRY2 Use essa macro para desambiguar dois branches de herança.
COM_INTERFACE_ENTRY_IID Use essa macro para inserir a interface no mapa COM e especificar seu IID.
COM_INTERFACE_ENTRY2_IID O mesmo que COM_INTERFACE_ENTRY2, exceto que você pode especificar um IID diferente.
COM_INTERFACE_ENTRY_AGGREGATE Quando a interface identificada por iid é consultada, COM_INTERFACE_ENTRY_AGGREGATE encaminha para punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND O mesmo que COM_INTERFACE_ENTRY_AGGREGATE, exceto que a consulta por IID resulta no encaminhamento da consulta para punk.
COM_INTERFACE_ENTRY_AUTOAGGREGATE O mesmo que COM_INTERFACE_ENTRY_AGGREGATE, exceto se punk for NULL, pois ele criará automaticamente a agregação descrita pelo clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND O mesmo que COM_INTERFACE_ENTRY_AUTOAGGREGATE, exceto que a consulta por IID resulta no encaminhamento da consulta para punk e, se punk for NULL, criará automaticamente a agregação descrita pelo clsid.
COM_INTERFACE_ENTRY_BREAK Faz com que o programa chame DebugBreak quando a interface especificada é consultada.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF Salva os dados específicos da interface para cada instância.
COM_INTERFACE_ENTRY_TEAR_OFF Expõe suas interfaces destacáveis.
COM_INTERFACE_ENTRY_CHAIN Processa o mapa COM da classe base quando o processamento atinge essa entrada no mapa COM.
COM_INTERFACE_ENTRY_FUNC Um mecanismo geral para conectar-se à lógica QueryInterface da ATL.
COM_INTERFACE_ENTRY_FUNC_BLIND O mesmo que COM_INTERFACE_ENTRY_FUNC, exceto que a consulta por IID resulta em uma chamada a func.
COM_INTERFACE_ENTRY_NOINTERFACE Retorna E_NOINTERFACE e encerra o processamento de mapa COM quando a interface especificada é consultada.

Requisitos

Cabeçalho: atlcom.h

COM_INTERFACE_ENTRY

Insere interfaces no mapa da interface COM.

Sintaxe

COM_INTERFACE_ENTRY( x )

Parâmetros

x
[in] O nome de uma interface da qual seu objeto de classe deriva diretamente.

Comentários

Normalmente, esse é o tipo de entrada usado com mais frequência.

Exemplo

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

Requisitos

Cabeçalho: atlcom.h

COM_INTERFACE_ENTRY2

Use essa macro para desambiguar dois branches de herança.

COM_INTERFACE_ENTRY2(x, x2)

Parâmetros

x
[in] O nome de uma interface que você deseja expor usando o objeto.

x2
[in] O nome do branch de herança do qual x é exposto.

Comentários

Por exemplo, se você derivar seu objeto de classe de duas interfaces duplas, exporá IDispatch usando COM_INTERFACE_ENTRY2 já que IDispatch pode ser obtido de uma das interfaces.

Exemplo

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 essa macro para inserir a interface no mapa COM e especificar seu IID.

COM_INTERFACE_ENTRY_IID(iid, x)

Parâmetros

iid
[in] O GUID da interface exposta.

x
[in] O nome da classe cuja vtable será exposta como a interface identificada por iid.

Exemplo

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

O mesmo que COM_INTERFACE_ENTRY2, exceto que você pode especificar um IID diferente.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

Parâmetros

iid
[in] O GUID que você está especificando para a interface.

x
[in] O nome de uma interface da qual seu objeto de classe deriva diretamente.

x2
[in] O nome de uma segunda interface da qual seu objeto de classe deriva diretamente.

COM_INTERFACE_ENTRY_AGGREGATE

Quando a interface identificada por iid é consultada, COM_INTERFACE_ENTRY_AGGREGATE encaminha para punk.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

Parâmetros

iid
[in] O GUID da interface consultada.

punk
[in] O nome de um ponteiro IUnknown.

Comentários

O parâmetro punk é assumido para apontar para o desconhecido interno de uma agregação ou para NULL. Nesse caso, a entrada é ignorada. Normalmente, você faria CoCreate a agregação em FinalConstruct.

Exemplo

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

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

O mesmo que COM_INTERFACE_ENTRY_AGGREGATE, exceto que a consulta por IID resulta no encaminhamento da consulta para punk.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

Parâmetros

punk
[in] O nome de um ponteiro IUnknown.

Comentários

Se a consulta de interface falhar, o processamento do mapa COM continuará.

Exemplo

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

O mesmo que COM_INTERFACE_ENTRY_AGGREGATE, exceto se punk for NULL, pois ele criará automaticamente a agregação descrita pelo clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

Parâmetros

iid
[in] O GUID da interface consultada.

punk
[in] O nome de um ponteiro IUnknown. Deve ser um membro da classe que contém o mapa COM.

clsid
[in] O identificador da agregação que será criado se punk for NULL.

Comentários

Exemplo

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

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

O mesmo que COM_INTERFACE_ENTRY_AUTOAGGREGATE, exceto que a consulta por IID resulta no encaminhamento da consulta para punk e, se punk for NULL, criará automaticamente a agregação descrita pelo clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

Parâmetros

punk
[in] O nome de um ponteiro IUnknown. Deve ser um membro da classe que contém o mapa COM.

clsid
[in] O identificador da agregação que será criado se punk for NULL.

Comentários

Se a consulta de interface falhar, o processamento do mapa COM continuará.

Exemplo

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

COM_INTERFACE_ENTRY_BREAK

Faz com que o programa chame DebugBreak quando a interface especificada é consultada.

COM_INTERFACE_ENTRY_BREAK(x)

Parâmetros

x
[in] Texto usado para construir o identificador de interface.

Comentários

O IID da interface será construído acrescentando x a IID_. Por exemplo, se x for IPersistStorage, o IID será IID_IPersistStorage.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

Salva os dados específicos da interface para cada instância.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

Parâmetros

iid
[in] O GUID da interface destacável.

x
[in] O nome da classe que implementa a interface.

punk
[in] O nome de um ponteiro IUnknown. Deve ser um membro da classe que contém o mapa COM. Deve ser inicializado como NULL no construtor do objeto de classe.

Comentários

Se a interface não for usada, isso reduzirá o tamanho geral da instância do objeto.

Exemplo

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

Expõe suas interfaces destacáveis.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

Parâmetros

iid
[in] O GUID da interface destacável.

x
[in] O nome da classe que implementa a interface.

Comentários

Uma interface destacável é implementada como um objeto separado que é instanciado toda vez que a interface que ela representa é consultada. Normalmente, você cria sua interface como destacável se a interface raramente é usada, pois isso salva um ponteiro vtable em cada instância do objeto principal. O elemento destacável é excluído quando sua contagem de referência se torna zero. A classe que implementa o elemento destacável deve ser derivada de CComTearOffObjectBase e ter seu próprio mapa COM.

Exemplo

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

Processa o mapa COM da classe base quando o processamento atinge essa entrada no mapa COM.

COM_INTERFACE_ENTRY_CHAIN(classname)

Parâmetros

classname
[in] Uma classe base do objeto atual.

Comentários

Por exemplo, no seguinte código:

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

Observe que a primeira entrada no mapa COM deve ser uma interface no objeto que contém o mapa COM. Portanto, você não pode iniciar as entradas de mapa COM com COM_INTERFACE_ENTRY_CHAIN, o que faz com que o mapa COM de um objeto diferente seja pesquisado no ponto em que COM_INTERFACE_ENTRY_CHAIN(COtherObject) aparece no mapa COM do objeto. Se você quiser pesquisar o mapa COM de outro objeto primeiro, adicione uma entrada de interface para IUnknown para o mapa COM e encadeie o mapa COM do outro objeto. Por exemplo:

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

COM_INTERFACE_ENTRY_FUNC

Um mecanismo geral para conectar-se à lógica QueryInterface da ATL.

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

Parâmetros

iid
[in] O GUID da interface exposta.

dw
[in] Um parâmetro passado para func.

func
[in] O ponteiro de função que retornará iid.

Comentários

Se iid corresponder ao IID da interface consultada, a função especificada por func será chamada. A declaração para a função deve ser:

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

Quando sua função é chamada, pv aponta para o objeto de classe. O parâmetro riid refere-se à interface que está sendo consultada, ppv é o ponteiro para o local em que a função deve armazenar o ponteiro para a interface e dw é o parâmetro especificado na entrada. A função deverá definir * ppv como NULL e retornar E_NOINTERFACE ou S_FALSE se optar por não retornar uma interface. Com E_NOINTERFACE, o processamento de mapa COM termina. Com S_FALSE, o processamento de mapa COM continua, mesmo que nenhum ponteiro de interface tenha sido retornado. Se a função retornar um ponteiro de interface, ela deverá retornar S_OK.

COM_INTERFACE_ENTRY_FUNC_BLIND

O mesmo que COM_INTERFACE_ENTRY_FUNC, exceto que a consulta por IID resulta em uma chamada a func.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

Parâmetros

dw
[in] Um parâmetro passado para func.

func
[in] A função que é chamada quando essa entrada no mapa COM é processada.

Comentários

Qualquer falha fará com que o processamento continue no mapa COM. Se a função retornar um ponteiro de interface, ela deverá retornar S_OK.

COM_INTERFACE_ENTRY_NOINTERFACE

Retorna E_NOINTERFACE e encerra o processamento de mapa COM quando a interface especificada é consultada.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

Parâmetros

x
[in] Texto usado para construir o identificador de interface.

Comentários

Você pode usar essa macro para impedir que uma interface seja usada em um caso específico. Por exemplo, você pode inserir essa macro no mapa COM antes de COM_INTERFACE_ENTRY_AGGREGATE_BLIND para impedir que uma consulta para a interface seja encaminhada para o desconhecido interno da agregação.

O IID da interface será construído acrescentando x a IID_. Por exemplo, se x for IPersistStorage, o IID será IID_IPersistStorage.