Поделиться через


Supporting IDispEventImpl

Класс IDispEventImpl шаблона можно использовать для предоставления поддержки приемников точки подключения в классе библиотеки ATL. Приемник точки подключения позволяет класс для обработки событий инициированный из внешних COM-объект. Эти приемники точки подключения сопоставлены с сопоставлением приемника событий, предоставляемым пользовательским классом.

Для правильной реализации приемника точки подключения для класса, необходимо выполнить следующие действия:

  • Импортировать библиотеку типов для каждого внешнего объекта

  • Объявите интерфейсы IDispEventImpl

  • Объявите сопоставление приемника событий

  • Посоветуйте и unadvise точки подключения

Шаги, необходимые для реализации приемника все точки подключения выполняются путем изменения только файл заголовка (h) класса.

Импортирование библиотек типов

Для каждого внешнего объекта события которого нужно изменить, необходимо импортировать библиотеку типов. Этот шаг определяет события, которые могут быть адресации и предоставляет сведения, используемые при объявлении сопоставление приемника событий. Директивы #import можно использовать для выполнения этого. Добавьте необходимые линии #import директивные для каждого интерфейса диспетчеризации, которые поддерживаются в файл заголовка (h) класса.

В следующем примере будет импортировать библиотеку типов внешних серверов COM (MSCAL.Calendar.7):

#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only

Примечание

Необходимо иметь отдельные выписку #import для каждой внешней библиотеки типов, которые поддерживаются.

Объявление интерфейсов IDispEventImpl

Теперь, когда были импортированы библиотеки типов каждого диспетчера взаимодействуют необходимо объявить интерфейсы IDispEventImpl отдельно для каждого внешнего интерфейса диспетчеризации. Измените объявление класса, добавив объявление интерфейса IDispEventImpl для каждого внешнего объекта. Дополнительные сведения о параметрах см. в разделе IDispEventImpl.

В следующем коде объявляется 2 приемников точки подключения для интерфейса DCalendarEvents для com-объекта, предоставляемого классом CMyCompositCtrl2:

public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>

Объявление сопоставление приемника событий

Для уведомления о событии, который будет решать нужную функцию, класс должен направлять каждое событие на правильный обработчик. Это достигается путем объявления сопоставление приемника событий.

Библиотеки ATL предоставляет несколько макросов, BEGIN_SINK_MAP, END_SINK_MAP и SINK_ENTRY_EX, которые делают это сопоставление. Стандартный формат следующим образом:

BEGIN_SINK_MAP(comClass)

SINK_ENTRY_EX(id, iid, dispid, func)

. . . //additional external event entries

END_SINK_MAP()

В следующем примере объявляется сопоставление приемника событий с 2 обработчиками событий:

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()

Реализация практически завершена. Последний шаг касается advise и unadvising внешних интерфейсов.

Advise и Unadvising интерфейсы IDispEventImpl

На последнем этапе реализация метода, посоветует (или unadvise) всем точкам соединения в правильном время. Это необходимо сделать до того как сообщение советуя между внешними клиентами и объектом может выполняться. Прежде чем объект становится видимым, каждый внешний интерфейс диспетчеризации, поддерживаемые объектом запрашивается для исходящих интерфейсов. Установления соединения и ссылки в исходящий интерфейс используется для обработки событий от объекта. Эта процедура называется "советующ".

После того как объект завершен с внешними интерфейсами, исходящие интерфейсы должны быть уведомитьы, что они больше не используются данным классом. Этот процесс называется "unadvising".

Из-за особенностей unique com-объекта, эта процедура изменяется, подробно и выполнение между реализациями. Эти сведения за пределами возможностей данного раздела, а не обращатьсяы.

См. также

Ссылки

Fundamentals of ATL COM Objects