Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A classe de modelo IDispEventImpl pode ser usada para fornecer suporte para coletores de ponto de conexão em sua classe ATL. Um coletor de ponto de conexão permite que sua classe manipule eventos disparados de objetos COM externos. Estes recetores de ponto de conexão são mapeados com um mapa de recetores de eventos, fornecido pela sua classe.
Para implementar corretamente um coletor de ponto de conexão para sua classe, as seguintes etapas devem ser concluídas:
Importar as bibliotecas de tipos para cada objeto externo
Declarar as
IDispEventImplinterfacesDeclarar um mapa de receptor de eventos
Aconselhar e desaconselhar os pontos de ligação
As etapas envolvidas na implementação de um coletor de ponto de conexão são todas realizadas modificando apenas o arquivo de cabeçalho (.h) de sua classe.
Importando as bibliotecas de tipos
Para cada objeto externo cujos eventos você deseja manipular, você deve importar a biblioteca de tipos. Esta etapa define os eventos que podem ser manipulados e fornece informações que são usadas ao declarar o mapa do coletor de eventos. A diretiva #import pode ser utilizada para o efeito. Adicione as linhas de diretiva necessárias #import para cada interface de despacho que você suportará ao arquivo de cabeçalho (.h) de sua classe.
O exemplo a seguir importa a biblioteca de tipos de um servidor COM externo (MSCAL.Calendar.7):
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
Observação
Você deve ter uma declaração separada #import para cada biblioteca de tipos externa que pretende suportar.
Declarando as interfaces IDispEventImpl
Agora que você importou as bibliotecas de tipos de cada interface de despacho, você precisa declarar interfaces separadas IDispEventImpl para cada interface de despacho externo. Modifique a declaração de sua classe adicionando uma IDispEventImpl declaração de interface para cada objeto externo. Para obter mais informações sobre os parâmetros, consulte IDispEventImpl.
O código a seguir declara dois pontos de recepção de conexão, para a interface DCalendarEvents, para o objeto COM implementado pela classe CMyCompositCtrl2.
public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>
Declarando um mapa do coletor de eventos
Para que as notificações de eventos sejam tratadas pela função adequada, sua classe deve rotear cada evento para seu manipulador correto. Isso é conseguido declarando um mapa de coletor de eventos.
A ATL fornece várias macros, BEGIN_SINK_MAP, END_SINK_MAP e SINK_ENTRY_EX, que facilitam esse mapeamento. O formato padrão é o seguinte:
BEGIN_SINK_MAP(comClass)
SINK_ENTRY_EX(id, iid, dispid, func)
. . . //additional external event entries
END_SINK_MAP()
O exemplo a seguir declara um mapa de coletor de eventos com dois manipuladores de eventos:
BEGIN_SINK_MAP(CMyCompositCtrl2)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar1)
SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()
A implementação está quase concluída. O último passo diz respeito ao aconselhamento e desaconselhamento das interfaces externas.
Aconselhando e removendo subscrição das interfaces IDispEventImpl
O passo final é implementar um método que irá notificar ou deixar de notificar todos os pontos de conexão nos momentos apropriados. Este aconselhamento deve ser feito antes que a comunicação entre os clientes externos e o seu objeto possa ocorrer. Antes que o objeto se torne visível, cada interface de despacho externa suportada pelo objeto é consultada em busca de interfaces de saída. Uma conexão é estabelecida e uma referência à interface de saída é usada para manipular eventos do objeto. Este procedimento é conhecido como "aconselhamento".
Depois que o objeto terminar com as interfaces externas, as interfaces de saída devem ser notificadas de que não são mais usadas pela sua classe. Este processo é conhecido como "desaconselhamento".
Devido à natureza exclusiva dos objetos COM, esse procedimento varia, em detalhes e execução, entre implementações. Esses detalhes estão além do escopo deste tópico e não são abordados.