- •107 Методические указания «Программное обеспечение сетей эвм. Часть 4. Версия 2. Развитие схемы «клиент-сервер» в com и corba»
- •Введение
- •1.1. Необходимость использования компонент
- •1.2. Методы встраивания компонентов
- •1.3. Основы com
- •1.4. Типы компонентов
- •1.5. Размещение управляющих элементов при помощи cWnd
- •1.6. Использование директивы #import
- •1.7.1 О компонентах
- •1.7. Компоновка тестовой программы
- •1.7.2 Регистрация компонентов
- •1.7.3 Импортирование библиотеки типов
- •1.7.4 Определение членов cDemoClientView
- •1.7.5 Создание компонентов
- •1.7.6 Создание точек взаимодействия
- •1.7.7 Синхронизация параметров
- •1.7.8 Обработка событий от компонентов
- •1.7.9 Очистка
- •1.7.10 Шаблонный код
- •1.9. Индивидуальные задания на работу
- •2.1. Проект. Основные принципы
- •2.2. Как создать компонент
- •Шаг 2: Создание компонента:
- •2.3. Значения по умолчанию
- •2.5. Индивидуальные задания на работу
- •3.1. Cоздание сервера com
- •3.2. Использование com-объектов
- •3.3. Индивидуальные задания на работу
- •Лабораторная работа № 4. Использование atl
- •4.1 Создание dcom-сервера с использованием atl
- •4.1.1 Введение в atl
- •4.1.2 Что такое atl?
- •4.1.3 Разделение труда
- •4.1.4 Создание хранилища компонентов с помощью atl Com AppWizard
- •4.1.5 Вставка кода заглушки/прокси-объекта.
- •4.1.7 Atl com-карта
- •4.1.9 Класс cComModule
- •4.1.10 Язык скриптов реестра в atl
- •4.1.11 Распределенная com (dcom)
- •4.1.12 Dcom и службы nt
- •4.1.13 Структура службы nt
- •4.1.14 Основанный на службах nt сервер сом
- •4.1.15 Создание проекта при помощи atl
- •4.1.16 Добавление функциональных средств
- •4.1.17 Функция CacheQuotes (dcomServiceXdcomService.Cpp)
- •4.1.18 Функция GetQuote (dcomServiceXdcomService.Cpp)
- •4.2 Создание dcom сервера
- •4.3 Создание dcom клиента
- •4.4 Индивидуальные задания на работу
- •Лабораторная работа № 5. Разработка corba приложений
- •5.1. Конфигурирование
- •5.2. Порядок действий
- •5.3. Объектно-ориентированный анализ и моделирование
- •5.4. Описание и трансляция объектов
- •5.5. Создание сервера
- •5.6. Создание клиента
- •5.7. Отладка объектов
- •5.8. Индивидуальные задания на работу
- •Лабораторная работа № 6. Адаптер роа
- •6.1. Архитектура poa
- •6.2. Политики poa
- •Политика обработки запросов
- •6.3. Создание серверов на основе poa
- •6.4. Индивидуальные задания на работу
- •Лабораторная работа № 7. Прикладная задача связи
- •7.1. Постановка задачи
- •7.1.1. Сотовая станция
- •7.1.2. Телефоны
- •7.1.3. Система
- •7.2. Функционирование системы
- •7.3. Индивидуальные задания на работу
- •Лабораторная работа № 8. Работа по умолчанию
- •8.1. Сервер с сервантом по умолчанию
- •8.2. Индивидуальные задания на работу
- •Лабораторная работа № 9. Создание менеджеров сервантов
- •9.1. Менеджеры сервантов
- •ServantActivator
- •ServantLocator
- •9.2. И снова практика
- •9.3. Индивидуальные задания на работу
- •Лабораторная работа № 10. Сервис именования
- •10.1. Сервис для именования (Naming Service)
- •10.2. Индивидуальные задания на работу
4.1.16 Добавление функциональных средств
Когда приложение содержит вызов программы, исполняемой на сервере непрерывно, тогда ее можно реализовать как службу Windows NT и заставить ее кэшировать данные при запуске и каждом их изменении. Служба сможет использовать кэш для доставки курсов акций клиенту. Чтобы реализовать эти возможности, можно добавить две функции-члена к классу CserviceModule:
void CServiceModule::CacheQuotes();
void CServiceModule::GetQuote(BSTR bstrTicker, double *pPrice);
Если для добавления функций-членов использовать мастер ClassWizard или контекстное меню панели Workspace, то реализация функций будет помещена в файл stdAfх. срр. Причина в том, что класс CServiceModule объявлен в файле stdAfx.h. Более удобно переместить реализацию в файл DCOMService.cpp.
Для кэширования можно использовать стандартный шаблон схемы соответствия (standard map template) библиотеки STL (Standard Template Library — библиотека стандартных шаблонов). Следует добавить в начало файла StdAfx.h следующие строки:
// Включение заголовочных файлов со схемой и строками
#include <map>
#include <string>
// Определение схемы курсов акций с использование шаблона схемы
typedef std::map<std::string, double> QUOTES;
Здесь определен тип данных QUOTES, который устанавливает соответствие между строковым типом данных STL (ключом) и типом double (значением, соответствующим ключу).
Можно объявить схему (mар) и итератор (iterator) как закрытые функции-члены, добавив в объявление класса CServiceModule следующие строки.
// Экземпляр схемы QUOTES
QUOTES theQMap;
// Итератор для нахождения элементов в схеме
QUOTES::iterator thelterator;
4.1.17 Функция CacheQuotes (dcomServiceXdcomService.Cpp)
void CServiceModule::CacheQuotes()
{
theQMap.insert(QUOTES::value_type("STK1",12345.65);
theQMap.insert(QUOTES::value_type("STK2",45935.55);
theQMap.insert(QUOTES::value_type("STK3",43546.97);
theQMap.insert(QUOTES::value_type("STK4",45.00));
theQMap.insert(QUOTES::value_type("STK5",121.43));
theQMap.insert(QUOTES::value_type("STK6",172.22));
theQMap.insert(QUOTES::value_type("STK7",229.77));
}
Функция использует метод insert для кэширования данных в схеме. В реальном приложении эта информация поступает из базы данных (а не закодирована жестко).
4.1.18 Функция GetQuote (dcomServiceXdcomService.Cpp)
//GetQuote служит для получения данных из кэша.
void CServiceModule :: GetQuote(BSTR bstrTicker, double *pPrice)
{
USES_CONVERSION;
std::string strTicker=W2A(bstrTicker ) ;
thelterator = theQMap. find(strTicker) ;
if(thelterator != theQMap. end())
*pPrice=(*thelterator).second;
else
*pPrice=0.0;
}
Это простая функция. Она использует метод mар::find и итератор для поиска значения, соответствующего предоставляемому символу. Необходимо гарантировать вызов функции CacheQuotes при запуске службы. Для этого перед вызовом _Module. Start можно добавить одну строку к _TWinMain.
_Module. CacheQuotes();
Для вызова функций-членов нужно добавить в проект компонент СОМ. С помощью мастера ATL Object Wizard следует добавить объект Simple Object и добавить в интерфейс IQuoteSupplier метод:
HRESULT GetQuote([in] BSTR Ticker, [out, retval] double * Price);
Все, что необходимо сделать в этой реализации метода, — вызвать функцию GetQuote() в глобальном экземпляре класса CServiceModule. Например:
STDMETHODIMP CQuoteSupplier::GetQuote(BSTR Ticker, double *Price)
{
_Module.GetQuote(Ticker, Price);
return S_OK;
}
Для доступа к глобальному экземпляру объявим внешнюю переменную в файле QuoteSupplier. h.
extern CServiceModule _Module
В результате получена полностью оснащенная служба WindowsNT, содержащая компонент СОМ с простым интерфейсом.
