Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Мартын 1(ComCorbaLab2004).doc
Скачиваний:
30
Добавлен:
10.02.2016
Размер:
1.81 Mб
Скачать

1.7.6 Создание точек взаимодействия

Как отмечалось, точки взаимодействия можно использовать для уведомления компонентом клиента о наступлении некоторых событий или запроса к клиенту на выполнение некоторых действий. Однако их можно использовать и для обеспечения взаимодействия между двумя компонентами в одном или разных контейнерах.

Компонент, предоставляющий точки взаимодействия, должен иметь интерфейс IConnectionPointContainer. В своей реализации этого интерфейса компонент указывает, какой именно интерфейс является интерфейсом точек взаимодействия. Клиент должен создать реализацию этого интерфейса и передать компоненту ссылку на эту реализацию. После этого компонент может вызывать методы интерфейса точек взаимодействия. Для реализации интерфейса взаимодействия клиент должен знать, какие методы и свойства этот интерфейс предоставляет. Обычно клиенту доступна эта информация, поскольку компонент определяет интерфейс точек взаимодействия в своей библиотеке типов. Разработчик клиента обычно пользуется этой информацией для того, чтобы определить, какие методы и свойства он должен реализовать для использования точек взаимодействия.

Первая точка взаимодействия, которая будет использоваться - интерфейс IDemoModelConnection. Он определен в компоненте DemoModel и является исходящим управляющим интерфейсом, при помощи которого компонент-модель может напрямую управлять компонентом представления. Управляющий элемент DemoView создает реализацию этого интерфейса, после чего компонент DemoModel может вызывать методы этого интерфейса. По отношению к общему описанию точек взаимодействия DemoView является клиентом, а DemoModel - компонентом. Следующий код показывает, как подключаются точки взаимодействия:

// создание точки взаимодействия между представлением и моделью

IConnectionPointContainerPtr pCPC = m_pModel;

IUnknownPtr pUnk = m_pView;

if (pCPC != NULL)

{

pCPC->FindConnectionPoint(__uuidof(IDemoModelConnection), &m_pCP);

if (m_pCP != NULL)

{

m_pCP->Advise(pUnk, &m_dwCookie);

}

}

Здесь снова использован оператор связывания класса-оболочки для непосредственного вызова QueryInterface() для интерфейса IConnectionPointContainer. То же самое сделано для получения указателя IUnknown на управляющий элемент представления. При успешном завершении вызывается метод FindConnectionPoint() интерфейса IConnectionPointContainer для компонента модели чтобы узнать, поддерживает ли он интерфейс точек взаимодействия IDemoModelConnection. Если это так, то указатель IUnknown передается компоненту представления, а в ответ принимается значение ключа для этого взаимодействия. После установки взаимодействия компонент DemoModel может вызывать любой метод интерфейса IDemoModelConnection компонента представления. Если заглянуть в код компонента, то видно, что модель создает таймер и периодически вызывает метод Update() для обновления угла поворота представления согласно новым показаниям скорости и времени.

1.7.7 Синхронизация параметров

Последнее, что осталось сделать - синхронизировать параметры компонента управления с компонентами представления и модели. Для этого нужно ввести изменения в функцию OnInitialUpdate():

// инициализация параметров компонентов

m_pView->bkgndColor = m_pController->bkcolor;

m_pModel->ChangeSpeed(m_pController->speed);

Из этой части кода видно, что интерфейс классов оболочек позволяет использовать свойства как члены-переменные соответствующих классов, получая либо изменяя значения свойств.

Это все, что потребуется изменить в функции OnInitialUpdate(), за одним исключением. Весьма полезно заключить приведенные выше строки в блок try: catch, поскольку классы-оболочки с интеллектуальными указателями возвращают результат вызовов методов интерфейсов через параметр HRESULT. Если его значение указывает на ошибку, класс-оболочка порождает исключение типа _com_error. В случае возникновения ошибки ее лучше обработать внутри блока обработки исключений. Для этого нужно разрешить обработку исключений для проекта. В проектах MFC она разрешена по умолчанию, а вот в проектах ATL - нет.