Поделиться через


Архитектура подключенных объектов

Соединительный объект — это только одна часть общей архитектуры соединительных объектов. Эта технология включает следующие элементы:

  • Объект, доступный для подключения. Реализует интерфейс IConnectionPointContainer; создает по крайней мере один объект точки подключения; определяет исходящий интерфейс для клиента.
  • Клиент. Запрашивает объект для IConnectionPointContainer для определения возможности подключения объекта; создает объект приемника для реализации исходящего интерфейса, определенного соединительным объектом.
  • Объект приемника. Реализует исходящий интерфейс; используется для установления подключения к подключаемому объекту.
  • Объект точки подключения. Реализует интерфейс IConnectionPoint и управляет подключением к приемнику клиента.

Связи между клиентом, подключаемым объектом, точкой подключения и приемником показаны на следующей схеме:

схема, показывающая точки подключения между клиентом и объектом Connectable.

Прежде чем объект точки подключения вызывает методы в интерфейсе приемника на шаге 3 на предыдущей схеме, он должен QueryInterface для определенного интерфейса, даже если указатель уже был передан в шаге 2 вызова методаСовет.

Два объекта перечислителя также участвуют в этой архитектуре, хотя и не показаны на рисунке. Один создается методом в IConnectionPointContainer для перечисления точек подключения в подключаемом объекте. Другой создается методом в IConnectionPoint для перечисления подключений, установленных в данный момент к этой точке подключения. Одна точка подключения может поддерживать несколько интерфейсов подключенного приемника, и она должна выполнять итерацию по списку подключений при каждом вызове метода в этом интерфейсе. Этот процесс называется многоадресной рассылкой.

При работе с подключенными объектами важно понимать, что соединительный объект, каждая точка подключения, каждый приемник и все перечислители являются отдельными объектами с отдельными реализации IUnknown, отдельными счетчиками ссылок и отдельными временем существования. Клиент, использующий эти объекты, всегда отвечает за освобождение всех ссылок, принадлежащих ему.

Заметка

Подключенный объект может поддерживать несколько клиентов и может поддерживать несколько приемников в клиенте. Аналогичным образом приемник может быть подключен к нескольким соединительным объектам.

 

Ниже приведены шаги по установлению соединения между клиентом и подключенным объектом:

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

Интерфейсы объектов, которые можно подключить