Suporte IDispEventImpl

A classe de modelo IDispEventImpl pode ser usada para fornecer suporte para pontos de conexão em seu objeto COM ATL. Um ponto de conexão permite que o objeto COM manipular eventos acionados dos objetos de COM externos. Esses pontos de conexão são mapeados com um mapa de coletor de eventos, fornecido pelo seu objeto COM.

Para implementar corretamente um ponto de conexão ou pontos para seu objeto COM, as etapas a seguir devem ser concluídas:

Neste procedimento, você irá modificar somente o arquivo de cabeçalho (. h) de sua classe COM.

Importando as bibliotecas de tipo

Para cada objeto externo cujos eventos deseja tratar, você deve importar a biblioteca de tipos. Esta etapa define os eventos que podem ser manipulados e fornece informações que são usadas quando declarar o mapa de coletor de eventos. A diretiva # Import pode ser usada para fazer isso. Adicione as linhas a Directiva necessário # Import para cada interface dispatch que oferecerá suporte ao arquivo de cabeçalho (. h) de sua classe COM.

O exemplo a seguir importa a biblioteca de tipos de um servidor COM externo ( MyServer ):

 # Import raw_interfaces_only de "D:\MyServer.dll", no_namespace, named_guids

&Notanbsp;  Você deve ter uma instrução separada # Import para cada Externo interface dispatch que oferecerá suporte.

Declarando as Interfaces IDispEventImpl

Agora que você importou as bibliotecas de tipo de cada interface dispatch, você precisa declarar interfaces separadas IDispEventImpl para cada Externo interface dispatch. Modifica a declaração de sua classe COM adicionando uma declaração de interface IDispEventImpl para cada objeto externo. Para obter mais informações sobre parâmetros, consulte IDispEventImpl.

As seguintes linhas de código declaram dois pontos de conexão, para o costume IExtEvents1 e IExtEvents2 interfaces para o objeto de COM implementadas pela classeCMyObj:

público IDispEventImpllt; 0, CMyObj, & DIID__IExtEvents1,
    & LIBID_EXTEVENTS1Lib, 1, 0 >,
IDispEventImpl pública < 1, CMyObj, & DIID__IExtEvents2,
    & LIBID_EXTEVENTS2Lib, 1, 0 & gt

Declarando um mapa de coletor de eventos

Para que as notificações de evento para serem manipulados pela função adequada, seu objeto COM deve rotear cada evento ao seu manipulador correto. Isto é conseguido, declarando um mapa de coletor de eventos.

ATL fornece várias macros, BEGIN_SINK_MAP, END_SINK_MAPe SINK_ENTRY, que facilitam esse mapeamento. O formato padrão é o seguinte:

BEGI&N_SINK_MAP(ComClass)
 nbsp; SINK_ENTRY (id,  dispid, func)
... //additional entradas de evento externo
END_SINK_MAP()

O exemplo a seguir declara um mapa de coletor de eventos com dois manipuladores de eventos:

BEGIN_SINK_MAP(CMyObj)
   SINK_ENTRY (0, Events1, OnClick1)
   SINK_ENTRY (0, Events2, OnClick2)
END_SINK_MAP()

A implementação é quase completa. A última etapa diz respeito avisando e unadvising as interfaces externas.

Avisando e Unadvising as Interfaces IDispEventImpl

A etapa final é implementar um método que irá avisar (ou unadvise) Tudo pontos de conexão nos horários adequados. Este aconselhamento deve ser feito antes da realização da comunicação entre os clientes externos e seu objeto. Antes que o objeto fique visível, cada Externo interface dispatch suportado pelo seu objeto é consultado para interfaces de saída. Uma conexão é estabelecida e uma referência para a interface de saída é usada para manipular eventos de Controlarar. Este procedimento é conhecido como "aconselhamento".

Depois que seu objeto é terminado com as interfaces externas, as interfaces de saída devem ser notificados que eles não são mais usados por seu objeto COM. Este processo é conhecido como "unadvising."

Por causa da natureza original de objetos COM, este 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.

Index