События COM
Обновлен: Ноябрь 2007
Данный раздел содержит обзор точек подключения и знакомит с терминологией, которая обычно используется для описания событий COM.
Точки подключения обеспечивают двустороннее взаимодействие между клиентом и сервером в модели COM. С помощью этого механизма COM-сервер может обратиться к клиенту при возникновении какого-либо события. Сервер (например обозреватель Microsoft Internet Explorer) может вызвать событие для оповещения соответствующей клиентской программы о каком-либо изменении (например об изменении заголовка). Чтобы подготовиться к получению входящих уведомлений, клиент создает внутренний COM-объект, называемый приемником событий. Получив уведомление, клиент может выполнить действия, связанные с данным событием.
Приемник событий содержит интерфейс для предоставления серверу методов, связанных с событием. Серверы порождают события путем вызова методов, связанных с событиями. Клиент реализует интерфейс приемника событий как обычный COM-интерфейс. Сервер объявляет интерфейс как исходящий; создатель COM-сервера применяет атрибут source к интерфейсу в библиотеке типов COM-сервера. Сервер использует определения из интерфейса приемника событий, чтобы определить методы sink и invoke.
COM-клиент, реализующий интерфейс приемника событий, часто называют приемником событий или просто приемником. На следующем рисунке приемник реализует интерфейс ISinkEvents. Сервер, вызывающий событие, называется источником.
Модель событий на основе точек подключения
После определения интерфейса приемника событий приемник должен быть подключен (привязан) к источнику. Механизм точек подключения использует для связывания приемника и источника следующий протокол:
Приемник запрашивает у объекта сервера интерфейс IConnectionPointContainer. Если объект поддерживает точки подключения, он возвращает указатель.
С помощью методов объекта-контейнера приемник находит интерфейс IConnectionPoint, предоставляющий конкретную точку подключения. Поскольку сервер может поддерживать несколько исходящих интерфейсов, клиент должен сопоставить свой приемник с идентификатором интерфейса (IID) конкретной точки подключения.
Получив нужный объект точки подключения, приемник вызывает метод IConnectionPoint::Advise для регистрации указателя интерфейса приемника. Сервер (источник) поддерживает подключение (и порождает через него события) до тех пор, пока клиент не разорвет подключение с помощью метода IConnectionPoint::Unadvise.
Visual Basic скрывает большинство деталей точек подключения, но в клиентское объявление сервера необходимо включить директиву WithEvents. В C++ клиентский код должен выполнять поиск и вызывать методы для интерфейсов IConnectionPointContainer и IConnectionPoint. Сервер реализует оба интерфейса.
См. также
Задачи
Практическое руководство. Вызов событий, обрабатываемых приемником COM
Практическое руководство. Обработка событий, вызванных COM-источником