Архитектура подключенных объектов
Соединительный объект — это только одна часть общей архитектуры соединительных объектов. Эта технология включает следующие элементы:
- Объект, доступный для подключения. Реализует интерфейс IConnectionPointContainer; создает по крайней мере один объект точки подключения; определяет исходящий интерфейс для клиента.
- Клиент. Запрашивает объект для IConnectionPointContainer для определения возможности подключения объекта; создает объект приемника для реализации исходящего интерфейса, определенного соединительным объектом.
- Объект приемника. Реализует исходящий интерфейс; используется для установления подключения к подключаемому объекту.
- Объект точки подключения. Реализует интерфейс IConnectionPoint и управляет подключением к приемнику клиента.
Связи между клиентом, подключаемым объектом, точкой подключения и приемником показаны на следующей схеме:
Прежде чем объект точки подключения вызывает методы в интерфейсе приемника на шаге 3 на предыдущей схеме, он должен QueryInterface для определенного интерфейса, даже если указатель уже был передан в шаге 2 вызова методаСовет.
Два объекта перечислителя также участвуют в этой архитектуре, хотя и не показаны на рисунке. Один создается методом в IConnectionPointContainer для перечисления точек подключения в подключаемом объекте. Другой создается методом в IConnectionPoint для перечисления подключений, установленных в данный момент к этой точке подключения. Одна точка подключения может поддерживать несколько интерфейсов подключенного приемника, и она должна выполнять итерацию по списку подключений при каждом вызове метода в этом интерфейсе. Этот процесс называется многоадресной рассылкой.
При работе с подключенными объектами важно понимать, что соединительный объект, каждая точка подключения, каждый приемник и все перечислители являются отдельными объектами с отдельными реализации IUnknown, отдельными счетчиками ссылок и отдельными временем существования. Клиент, использующий эти объекты, всегда отвечает за освобождение всех ссылок, принадлежащих ему.
Заметка
Подключенный объект может поддерживать несколько клиентов и может поддерживать несколько приемников в клиенте. Аналогичным образом приемник может быть подключен к нескольким соединительным объектам.
Ниже приведены шаги по установлению соединения между клиентом и подключенным объектом:
- Клиентские запросы для IConnectionPointContainer объекта, чтобы определить, можно ли подключить объект. Если этот вызов выполнен успешно, клиент содержит указатель на интерфейс IConnectionPointContainer в подключаемом объекте, а счетчик ссылок на подключенный объект был добавлен. В противном случае объект недоступен для подключения и не поддерживает исходящие интерфейсы.
- Если объект доступен для подключения, клиент затем пытается получить указатель на интерфейс IConnectionPoint в точке подключения в подключаемом объекте. Существует два метода получения этого указателя, как в IConnectionPointContainer::FindConnectionPoint, так и в IConnectionPointContainer::EnumConnectionPoints. При использовании EnumConnectionPoints необходимо выполнить несколько дополнительных действий. (Дополнительные сведения см. в разделе using IConnectionPointContainer.) В случае успешного выполнения соединительный объект и клиент поддерживают один и тот же исходящий интерфейс. Подключенный объект определяет его и вызывает его, и клиент реализует его. Затем клиент может взаимодействовать через точку подключения в подключаемом объекте.
- Затем клиент вызывает Совет в точке подключения, чтобы установить соединение между интерфейсом приемника и точкой подключения объекта. После этого вызова точка подключения объекта содержит указатель на исходящий интерфейс в приемнике.
- Код внутри Совет вызывает вызовы QueryInterface на указателе интерфейса, который передается, запрашивая конкретный идентификатор интерфейса, к которому он подключается.
- Объект вызывает методы в интерфейсе приемника по мере необходимости, используя указатель, удерживаемый точкой подключения.
- Клиент вызывает Unadvise, чтобы завершить подключение. Затем клиент вызывает IConnectionPoint::Release, чтобы освободить его удержание в точке подключения и, следовательно, основной объект, доступный для подключения. Клиент также должен вызвать IConnectionPointContainer::Release, чтобы освободить его удержание в основном подключаемом объекте.
Связанные разделы