Сводка по обработке событий ATL
Как правило, обработка событий COM является относительно простым процессом. Существует три основных шага.
Реализуйте интерфейс событий в объекте.
Сообщите источнику событий, что объект хочет получать события.
Отмените источник событий, когда объект больше не должен получать события.
Реализация интерфейса
Существует четыре основных способа реализации интерфейса с помощью ATL.
Производный от | Подходит для типа интерфейса | Требуется реализовать все методы* | Требуется библиотека типов во время выполнения |
---|---|---|---|
Интерфейс | Vtable | Да | Нет |
IDispatchImpl | Двойной | Да | Да |
IDispEventImpl | Dispinterface | No | Да |
IDispEventSimpleImpl | Dispinterface | No | No |
* При использовании классов поддержки ATL никогда не требуется реализовать IUnknown
методы вручную IDispatch
.
Консультирование и отмена управления источником событий
Существует три основных способа консультирования и отмены источника событий с помощью ATL.
Советная функция | Функция unadvise | Наиболее подходящий для использования с | Требуется отслеживать файл cookie | Комментарии |
---|---|---|---|---|
AtlAdvise, CComPtrBase::Advise | AtlUnadvise | Виртуальные или двойные интерфейсы | Да | AtlAdvise — это глобальная функция ATL. CComPtrBase::Advise используется CComPtr и CComQIPtr. |
IDispEventSimpleImpl::D ispEventAdvise | IDispEventSimpleImpl::D ispEventUnadvise | IDispEventImpl или IDispEventSimpleImpl | No | Меньше параметров, чем AtlAdvise так как базовый класс делает больше работы. |
CComCompositeControl::AdviseSinkMap(TRUE) | CComCompositeControl::AdviseSinkMap(FALSE) | Элементы ActiveX в составных элементах управления | No | CComCompositeControl::AdviseSinkMap советует всем записям в карте приемника событий. Та же функция не выполняет ввод записей. Этот метод вызывается автоматически классом CComCompositeControl . |
CAxDialogImpl::AdviseSinkMap(TRUE) | CAxDialogImpl::AdviseSinkMap(FALSE) | Элементы ActiveX в диалоговом окне | No | CAxDialogImpl::AdviseSinkMap советует и отменяет все элементы ActiveX в ресурсе диалогового окна. Это выполняется автоматически. |