Принципы обработки событий
Существует три шага, общих для всех операций обработки событий. Вам потребуется:
Реализуйте интерфейс событий в объекте.
Сообщите источнику событий, что объект хочет получать события.
Отмените источник событий, когда объект больше не должен получать события.
Способ реализации интерфейса событий будет зависеть от его типа. Интерфейс событий может быть vtable, двойной или dispinterface. Это до конструктора источника событий для определения интерфейса; Это до вас, чтобы реализовать этот интерфейс.
Примечание.
Хотя нет технических причин, по которым интерфейс событий не может быть двойным, существует ряд хороших причин проектирования, чтобы избежать использования двойных. Однако это решение, принятое конструктором или реализацией источника событий. Так как вы работаете с точки зрения события sink
, необходимо разрешить возможность того, что у вас нет выбора, но для реализации двух интерфейсов событий. Дополнительные сведения о двойных интерфейсах см. в разделе "Двойные интерфейсы" и ATL.
Советы по источнику событий можно разбить на три шага:
Запрос исходного объекта для IConnectionPointContainer.
Вызовите IConnectionPointContainer::FindConnectionPoint , передав iiD интерфейса событий, который вас интересует. В случае успешного выполнения он вернет интерфейс IConnectionPoint в объекте точки подключения.
Вызов IConnectionPoint ::Совет по передаче
IUnknown
приемника событий. В случае успешного выполнения возвращаетсяDWORD
файл cookie, представляющий соединение.
После успешной регистрации интереса к получению событий методы в интерфейсе событий объекта будут вызываться в соответствии с событиями, запускаемыми исходным объектом. Если вы больше не хотите получать события, вы можете передать файл cookie обратно в точку подключения через IConnectionPoint::Unadvise. Это приведет к разрыву соединения между источником и приемником.
Будьте осторожны, чтобы избежать ссылочных циклов при обработке событий.