Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Примечание.
Библиотека активных шаблонов (ATL) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Шаблонный класс IDispEventImpl можно использовать для поддержки точек подключения в вашем классе ATL. Приемник точки подключения позволяет классу обрабатывать события, исходящие из внешних COM-объектов. Эти точки подключения сопоставляются с картой приемника событий, предоставляемой вашим классом.
Чтобы правильно реализовать приемник точки подключения для класса, необходимо выполнить следующие действия:
Импорт библиотек типов для каждого внешнего объекта
IDispEventImplОбъявите интерфейсыОбъявите карту обработчиков событий
Регистрация и отмена регистрации точек подключения
Шаги, связанные с реализацией синхронизатора точек подключения, выполняются путем изменения только файла заголовка (.h) вашего класса.
Импорт библиотек типов
Для каждого внешнего объекта, события которого требуется обрабатывать, необходимо импортировать библиотеку типов. На этом шаге определяются события, которые могут обрабатываться, и предоставляются сведения, используемые при объявлении карты обработки событий. Для этого можно использовать директиву #import . Добавьте необходимые #import строки директив для каждого интерфейса диспетчера, который будет поддерживаться в файле заголовка (H) класса.
В следующем примере импортируется библиотека типов внешнего COM-сервера (MSCAL.Calendar.7):
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
Примечание.
Необходимо иметь отдельную #import инструкцию для каждой внешней библиотеки типов, которые вы будете поддерживать.
Объявление интерфейсов IDispEventImpl
Теперь, когда вы импортировали библиотеки типов каждого интерфейса диспетчера, необходимо объявить отдельные IDispEventImpl интерфейсы для каждого внешнего интерфейса диспетчера. Измените объявление своего класса, добавив объявление интерфейса IDispEventImpl для каждого внешнего объекта. Дополнительные сведения о параметрах см. в разделе IDispEventImpl.
Следующий код объявляет два приемных элемента точек подключения для интерфейса 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()
В следующем примере объявляется карта приемника событий с двумя обработчиками событий:
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()
Реализация почти завершена. Последний шаг касается консультирования и отмены внешних интерфейсов.
Советы по подключению и отключению интерфейсов IDispEventImpl
Последний шаг — реализовать метод, который будет рекомендовать (или отменять рекомендацию) все точки подключения в нужное время. Перед началом взаимодействия между внешними клиентами и вашим объектом необходимо провести соответствующее уведомление. Перед тем как объект станет видимым, каждый внешний интерфейс диспетчера, поддерживаемый объектом, запрашивается для исходящих интерфейсов. Устанавливается соединение, а ссылка на исходящий интерфейс используется для обработки событий из объекта. Эта процедура называется "консультацией".
После завершения работы объекта с внешними интерфейсами исходящие интерфейсы должны быть уведомлены о том, что они больше не используются классом. Этот процесс называется "отмена рекомендации".
Из-за уникальной природы COM-объектов эта процедура зависит от детализации и выполнения между реализациями. Эти сведения выходят за рамки этой статьи и не рассматриваются.