На этом шаге мы рассмотрим содержание библиотеки 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.
На следующем шаге мы рассмотрим добавление функции в расширение сервера.