Мегаобучалка Главная | О нас | Обратная связь


Добавление функциональных средств



2015-11-12 482 Обсуждений (0)
Добавление функциональных средств 0.00 из 5.00 0 оценок




Когда приложение содержит вызов программы, исполняемой на сервере непрерывно, тогда ее можно реализовать как службу 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;

 

Функция 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 для кэширования данных в схеме. В реальном приложении эта информация поступает из базы данных (а не закодирована жестко).

Функция 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

 

В результате получена полностью оснащенная служба Windows NT, содержащая компонент СОМ с простым интерфейсом.

Создание DCOM сервера

В среде разработки Microsoft Visual Studio 6.0 выбирается пункт меню New. Тип проекта выбирается ATL COM AppWizard.

 

Рис. 4.1 Выбор ATL COM AppWizard

 

Для DCOM сервера тип должен быть EXE.

Рис. 4.2 Выбор типа сервера

 

Следующее окно сообщает, какие файлы будут созданы в качестве основы:

 

Рис. 4.3 Создаваемые базовые файлы

 

В рабочем пространстве проекта появятся такие классы и файлы:

 

Рис. 4.4 Предоставленные классы и файлы

 

Следующим шагом является создание нового ATL объекта (рис. 5). В появившемся окне следует выбрать Simple Object (рис. 6).

 

Рис. 4.5 Создание нового ATL-объекта

 

Далее указываются имя объекта, потоковую модель, тип интерфейса, поддержку точек соединения.

 

Рис. 4.6 Указание имени объекта и выбор потоковой модели

 

В результате будет создан нужный класс, и добавятся соответствующие файлы.

 

Рис. 4.7 Итоговое добавление классов и файлов

 

Далее добавляется метод slvMult к интерфейсу Isolver, указывается имя метода и список параметров.

 

Рис. 4.8 Добавление метода slvMult и указание имени метода и списка параметров

 

В результате в рабочее пространство добавляются соответствующие классы и файлы.

 

Рис. 4.9 Добавление классов и файлов

 

После этого следует добавить функцию класса CExeModule. В появившемся окне необходимо указать тип возвращаемого значения и описание функции.

 

Рис. 4.10 Добавление функции класса CexeModule и указание
типа возвращаемого значения и описания функции

 

После этого необходимо добавить следующий код:

 

stdafx.cpp

 

double CExeModule::Mult(double op1, double op2)

{

return op1 * op2;

}

 

solver.cpp

 

STDMETHODIMP CSolver::slvMult(double arg1, double arg2, double *multres)

{

* multres = _Module.Mult(arg1, arg2);

return S_OK;

}

 

Создание DCOM клиента

В простейшем случае можно использовать проект типа Win32 Console Application. Весь код программы может сводиться к следующему:

 

//**! by DarkPark Group

//**! Ukraine, Odessa 2002

//**! ----------------------------------

//**! программа запрашивает два числа и

//**! отправляет их серверу dpMathSolver

 

#include "stdafx.h"

#include "iostream.h"

#include "objbase.h"

 

// файлы для доступа к серверу

#include "..\dpMathSolver\dpMathSolver_i.c"

#import "..\dpMathSolver\dpMathSolver.tlb" no_namespace

 

int main(int argc, char* argv[])

{

/*** вывод стартовых сообщений ***/

cout << "dpMathClient version 1.a" << endl;

cout << "DarkPark Group, Ukraine, Odessa 2002" << endl;

 

double op1, op2;

cout << "Enter first number: "; cin >> op1;

cout << "Enter second number: "; cin >> op2;

 

/*** инициализация библиотеки COM ***/

CoInitialize(NULL);

 

ISolver * pSlv = NULL;

/*** создание экземпляра указанного класса ***/

HRESULT hr = CoCreateInstance(CLSID_Solver, NULL, CLSCTX_SERVER, IID_ISolver, (void**)&pSlv);

if(SUCCEEDED(hr)) {

/*** в случае успешного подключения ... ***/

double result = 0;

result = pSlv->slvMult(op1, op2);

cout << "Server return: " << result;

pSlv->Release(); // освобождение сервера

}

else {

/*** сервер не найден ***/

cout << "*** Error while connecting to the server ***";

}

 

/*

закрытие библиотеки COM текущего потока, выгрузка из памяти всех DLL файлов,

загруженных потоком, освобождение всех других связанных ресурсов, а также

закрытие все RPC соединений этого потока

*/

CoUninitialize();

return 0;

}

 

Результат выполнения программы:

 

dpMathClient version 1.a

DarkPark Group, Ukraine, Odessa 2002

Enter first number: 2.56

Enter second number: 1.28

Server return: 3.2768

 



2015-11-12 482 Обсуждений (0)
Добавление функциональных средств 0.00 из 5.00 0 оценок









Обсуждение в статье: Добавление функциональных средств

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (482)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)