Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11276 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 28:

Серверные приложения

< Лекция 27 || Лекция 28: 1234

Таблица описания команд

Для таблицы описания команд в MFC-библиотеку включены пять следующих макросов:

  • BEGIN_PARSE_MAP - определяет начало таблицы описания команд и указывает класс функций членов и базовый класс.
  • END_PARSE_MAP - определяет конец таблицы описания команд..
  • ON_PARSE_COMMAND - идентифицирует команду и указывает соответствующую ей функцию.
  • ON_PARSE_COMMAND_PARAMS - определяет список параметров обрабатываемой команды. Этот макрос должен следовать непосредственно за макросом ON_PARSE_COMMAND.
  • DEFAULT_PARSE_COMMAND - определяет команду, используемую в том случае, если нет явного указания выполняемой команды.

Макрос ON_PARSE_COMMAND используется при определении команды для объекта класса CHttpServer (или наследуемого от него), поступающей от клиента, и имеет следующее описание:

ON_PARSE_COMMAND(FnName, mapClass, Args)

Параметры:

FnName - имя функции члена класса, а также и имя команды.

mapClass - имя класса указанной функции.

Args - указывает тип списка параметров и может принимать следующие значения

ITS_EMPTY - параметров нет;

ITS_PSTR - указатель на строку;

ITS_RAW - данные, предварительно не обрабатываемые. Используется в том случае, если список параметров HTTP-запроса может иметь различное число параметров;

ITS_I2 - значение типа short

ITS_I4 - значение типа long

ITS_R4 - значение типа float

ITS_R8 - значение типа double

ITS_I8 - значение типа 64-битовое integer

ITS_ARGLIST - указатель на объект типа CHttpArgList.

Например:

BEGIN_PARSE_MAP(CDerivedClass, CHttpServer)
  DEFAULT_PARSE_COMMAND(Myfunc, CDerivedClass)
		// Для запроса типа
		// http://LOCALSERVER/MyISAPI_1.dll?Myfunc&string1&135
  ON_PARSE_COMMAND(Myfunc,		// Имя функции
				CDerivedClass,		// Имя класса
				ITS_PSTR ITS_I2)	// Список из двух параметров: 
							// указатель на строку, значение типа short
  ON_PARSE_COMMAND_PARAMS("string integer=42")

		// Для запроса с тремя параметрами
  ON_PARSE_COMMAND(Myfunc2, 
                   CDerivedClass, 
                   ITS_PSTR ITS_I2 ITS_PSTR)
  ON_PARSE_COMMAND_PARAMS("string integer string2='Default value'")
   DEFAULT_PARSE_COMMAND(Myfunc3, CDerivedClass)
   ON_PARSE_COMMAND(Myfunc3, CDerivedClass, 
				ITS_RAW)     // Различное число параметров
END_PARSE_MAP(CDerivedClass)

// Функции, выполняемые для обработки команд
void Myfunc(CHttpServerContext* pCtxt, LPTSTR pszName, int nNumber)     
{   }			// Первый параметр стандартен для всех функций, 
				// обрабатывающих команды, тип второго и третьего 
				// параметра был указан в макросе ON_PARSE_COMMAND
void Myfunc2(CHttpServerContext* pCtxt, LPTSTR pszName, 
		int nNumber, LPTSTR pszTitle)
{   }
void CDerivedClass::Myfunc3(   // Используется тип параметров 
                               // ITS_RAW
    CHttpServerContext* pCtxt, 
    void* pVoid,   // pVoid - указатель на передаваемые данные
    DWORD dwBytes) // dwBytes - количество переданных байтов данных
{   }
Листинг 28.2.

Разбор списка параметров

Для запросов типа http://LOCALSERVER/MyISAPI_2.dll?Myfunc&s1= 10&s2=35&c1=y можно использовать макрос с типом параметров ITS_ARGLIST :

ON_PARSE_COMMAND(Myfunc, CMyHttpServer, ITS_ARGLIST).

Далее для разбора такого списка параметров используется класс CHttpArgList.

Класс CHttpArgList представляет собой массив структур типа CHttpArg.

При этом данные доступны через объект CHttpArg.

Поле CHttpArg::m_pstrValue содержит значение параметра, а поле CHttpArg::m_pstrArg - имя параметра.

Например:

для строки http://localserver/my1.dll&Arg1=hockey&Arg2&Arg3=beer+nuts надо реализовать разбор параметров по следующей схеме.


Выполнение ISAPI-приложения

Для выполнения ISAPI-приложения соответствующую DLL-библиотеку следует поместить в каталог web-сервера. Таким сервером может быть Internet Information Server или любой другой web-сервер.

Для просмотра сведений о виртуальных каталогах web-сервера на панели инструментов следует выбрать пиктограмму Administrative Tools и открыть диалог для администрирования web -сервера.

Для IIS сервера следует выбрать пиктограмму Internet Information Services. Отображаемый далее диалог Internet Information Services (рис. 28.1) позволяет получать информацию и настраивать ISS сервер.

Диалог Internet Information Services

Рис. 28.1. Диалог Internet Information Services

Для того, чтобы получить информацию о расположении домашнего каталога ISS-сервера, следует на панели, расположенной слева, выделить элемент Default Web Site и выполнить команду контекстного меню Properties.

В диалоге Default Web Site Properties на странице Home Directory в поле Local Path указано расположение домашнего каталога. Для того чтобы из данного каталога можно было загружать как HTML-файлы, так и DLL-файлы, значение поля Executable Permissions должно быть установлено равным Script and Executables.

После размещения ISAPI-приложения в домашнем каталоге web-сервера, это приложение можно выполнить в web-броузере, указав соответствующий URL-адрес.

При выполнении приложения на локальном компьютере в качестве имени сервера указывается LOCALHOST.

Например: http://LOCALHOST/MyISAPI_1.dll.

При размещении ISAPI-приложения на web -сервере имя приложения можно изменить. На рис. 28.2 приведен результат выполнения в web-браузере описанного выше ISAPI-приложения.

Выполнение ISAPI-приложения в web -браузере

Рис. 28.2. Выполнение ISAPI-приложения в web -браузере

При первом выполнения ISAPI-приложения сервер загружает данную DLL. При всех последующих вызовах обращение происходит к уже загруженной DLL.

< Лекция 27 || Лекция 28: 1234
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);