Шаг 241.
Среда программирования Visual C++.
Изучение кода библиотеки MyExtension

    На этом шаге мы рассмотрим содержание библиотеки MyExtension.

    Просмотрев исходный текст проекта MyExtension, Вы обнаружите, что мастер ISAPI Extension Wizard создал один класс с именем CMyExtensionExtension. Он является производным от MFC-класса CHttpServer. Вы можете добавлять в этот класс свои функции-члены, таким образом реализуя экспортируемые ISAPI-расширение функции.

    MFC поддерживает структуру, которая называется картой анализа (parse map) и служит для определения функций DLL и связывания их с функциями-членами класса, производного от CHttpServer. Карта анализа объявляется в заголовочном файле макросом DECLARE_PARSE_MAP и реализуется макросами BEGIN_PARSE_MAP и END_PARSE_MAP, как показано в следующем коде из файла MyExtension.cpp:

BEGIN_PARSE_MAP(CMyExtensionExtension, CHttpServer)
	// TODO: insert your ON_PARSE_COMMAND() and 
	// ON_PARSE_COMMAND_PARAMS() here to hook up your commands.
	// For example:

	ON_PARSE_COMMAND(Default, CMyExtensionExtension, ITS_EMPTY)
	DEFAULT_PARSE_COMMAND(Default, CMyExtensionExtension)
END_PARSE_MAP(CMyExtensionExtension)

    Как Вы видите, мастер ISAPI Extension Wizard добавил макрос DEFAULT_ PARSE_COMMAND для задания имени функции по умолчанию - Default(). Созданную им простую реализацию этой функции мы приведем чуть ниже:

void CMyExtensionExtension::Default(CHttpServerContext* pCtxt)
{
  StartContent(pCtxt);
  WriteTitle(pCtxt);

  *pCtxt << _T("This default message was produced by the Internet");
  *pCtxt << _T(" Server DLL Wizard. Edit your CMyExtensionExtension::Default()");
  *pCtxt << _T(" implementation to change it.\r\n");

  EndContent(pCtxt);
}

    Результат работы этой функции показан на рисунке 1.


Рис.1. Результат выполнения MyExtension.dll в Internet Explorer

    Default(), как и все функции ISAPI-расширения, принимает указатель на объект CHttpServerContext. Для каждой клиент-серверной HTTP-транзакции объект CHttpServer создает отдельный экземпляр CHttpServerContext. При обработке вызовов DLL-расширение сервера вызывает функции-члены CHttpServerContext для выполнения таких задач, как извлечение информации из HTTP-заголовка клиентского вызова (средствами CHttpServerContext::GetServerVariable()) или вставка HTML-текста в файл ответа, возвращаемый клиенту (с помощью перегруженного оператора <<).

    Для любого клиентского вызова объект CHttpServer расширения сервера создает объект CHttpServerContext. Каждый из них создается в отдельном потоке, что позволяет одновременно обслуживать множественные обращения к объекту CHttpServer от клиентов. Вы обязаны обеспечить синхронизацию глобальных переменных, а также любых членов-данных класса CHttpServer.

    На следующем шаге мы рассмотрим добавление функции в расширение сервера.




Предыдущий шаг Содержание Следующий шаг