Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Мартын 1(ComCorbaLab2004).doc
Скачиваний:
34
Добавлен:
10.02.2016
Размер:
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, содержащая компонент СОМ с простым интерфейсом.