Опубликован: 24.11.2006 | Доступ: свободный | Студентов: 716 / 33 | Оценка: 4.46 / 4.54 | Длительность: 17:18:00
Лекция 5:

Расширения ISAPI

Построение простого расширения ISAPI

Расширения ISAPI имеют такую несложную структуру, что могут создаваться без помощи MFC или ATL. Расширение ISAPI можно написать, используя файл включения расширения httpext.h и файл DLL definition export file (DEF) с экспортом двух следующих функций:

HttpExtensionProc;
GetExtensionVersion.

Каждое расширение ISAPI должно поддерживать эти функции. Оно может также экспортировать функцию TerminateExtension (это не является обязательным). После настройки проекта DLL расширение нужно применить к IIS. В Visual Studio .NET имеется шаблон проекта ISAPI, запускающий мастер расширения ISAPI. Этот мастер создает класс, названный по имени проекта, наследуемый из класса CHTTPServer и содержащий необходимые функции ISAPI. Мастер расширения ISAPI использует файлы заголовков для поддержки от MFC, ATL и httpext.h для получения классов и структур ISAPI.

Работа с мастером расширения ISAPI будет описана позже. Рассмотрим метод создания простого расширения ISAPI с минимальной поддержкой MFC и ATL без помощи мастера.

  1. В Visual Studio .NET выберите команду File\New\Project (Файл\Создать\Проект) для открытия диалогового окна New Project (Новый проект).
  2. В диалоговом окне New Project (Новый проект) щелкните на узле Visual C++ Projects (Проекты Visual C++) в левой части окна и выберите шаблон проекта Win32. Присвойте проекту имя HelloWorld и выберите место расположения создаваемого проекта.

    При нажатии на кнопку More (Больше) диалоговое окно New Project (Новый проект) отобразит дополнительную информацию о том, в каком месте будет создан проект. Название данной кнопки изменится на Less (Меньше). По умолчанию Visual Studio создает каталог с именем, идентичным имени проекта, в папке, указанной в текстовом поле Location (Расположение), в котором располагаются все файлы проекта. На рисунке 5.2 показано, что в текстовом поле Location (Расположение) введено значение C:\bookMaterial\IISBook\17ISAPIExtension\code, а именем проекта является HelloWorld.

    Диалоговое окно New Project (Новый проект) с выбранным проектом Win32

    Рис. 5.2. Диалоговое окно New Project (Новый проект) с выбранным проектом Win32
  3. Нажмите на кнопку OK для запуска мастера приложений Win32 (Win32 Application Wizard) (см. рис. 5.3).
    Обзор в мастере приложения Win32

    Рис. 5.3. Обзор в мастере приложения Win32
  4. Откройте вкладку Application Settings (Параметры приложения) в левой части мастера приложений Win32.
  5. Выберите DLL в качестве типа приложения (см. рис. 5.4).
    Создание проекта Win32 DLL.

    Рис. 5.4. Создание проекта Win32 DLL.
  6. Нажмите на кнопку Finish (Готово); Visual Studio создаст каталог C:\bookMaterial\IISBook\17ISAPIExtension\code\HelloWorld и разместит в нем файлы проекта.
  7. Выберите команду Project\Properties (Проект\Свойства) для открытия окна свойств страницы.
  8. Выберите в левой части окна свойств узел Precompiled Header в узле C/C++ для отображения свойств проекта.
  9. Visual Studio .NET не имеет шаблона проекта, который реализуется без заранее скомпилированного заголовка, поэтому выберите шаблон проекта Win32, создайте из проекта библиотеку DLL и удалите параметр заранее скомпилированного заголовка. В ниспадающем списке Create\Use Precompiled Header (Создать\Использовать готовый заголовок) выберите Not Using Precompiled Headers (Не использовать готовые заголовки) в ниспадающем списке Create\Use Precompiled Header (Создать\Использовать готовый заголовок) (см. рис. 5.5).
    Изменение параметра готового заголовка проекта

    увеличить изображение
    Рис. 5.5. Изменение параметра готового заголовка проекта
  10. Нажмите на кнопку OK в окне свойств. Откроется окно Solution Explorer (Обозреватель решения); если это не так, то выберите в меню команду View\Solution Explorer (Вид\Обозреватель решения).
  11. Готовый заголовок не используется, поэтому удалите файлы stdafx, созданные Visual Studio .NET для его поддержки. В окне Solution Explorer выделите заголовок stdafx и файлы реализации, щелкните правой кнопкой мыши и выберите Remove (Удалить) (см. рис. 5.6).

    Рис. 5.6.
  12. Теперь нужно добавить в проект DEF. Для этого щелкните правой кнопкой мыши на имени проекта в Solution Explorer и выберите команду Add\Add New Item (Добавить\Добавить новый элемент).
  13. В диалоговом окне Add New Item (Добавление нового элемента) выделите DEF File (Файл DEF) и присвойте файлу имя Hello World в соответствии с именем проекта (см. рис. 5.7). Имя файла должно соответствовать имени DLL, иначе компилятор C++ отобразит предупреждение о несоответствии имен файлов. Рассматриваемый файл DEF (файл экспорта определения) описывает функции, экспортируемые из DLL, чтобы другое приложение могло загрузить DLL и найти адреса функций.
    Добавление в проект файла экспорта определения

    Рис. 5.7. Добавление в проект файла экспорта определения
  14. Нажмите на кнопку Open (Открыть) в диалоговом окне Add New Item (Добавить новый элемент) для добавления в проект нового файла DEF.

Шаблоны проекта Visual Studio используют встроенный механизм MFC для экспорта функций и использования библиотеки DLL расширения ISAPI программой-потребителем, каковой является IIS. В Visual Studio .NET нет шаблона проекта, создающего конечный продукт без готового заголовка, поэтому следует выбрать шаблон проекта Win32, преобразовать его в DLL, после чего удалить ненужные файлы и настройки. При создании проекта без поддержки MFC иногда возникают некоторые сложности. Однако MFC сами по себе достаточно сложны, поэтому небольшие проекты (как в нашем примере) можно упростить, отказавшись от использования MFC.

Следующим шагом является настройка файла DEF.

Файл экспорта определения

После добавления в проект файла DEF имя библиотеки в файле будет идентично имени проекта (иначе Visual Studio .NET отобразит предупреждение). В нашем проекте имя выглядит следующим образом:

LIBRARY    HelloWorld

В файл DEF добавим блок DESCRIPTION для описания назначения библиотеки DLL. Описание заключается в одинарные кавычки. Блок DESCRIPTION не является обязательным в отличие от блока EXPORTS. Имена функций следуют после объявления блока EXPORTS. В листинге 5.1 приведен код файла экспорта определения, использованный в нашем проекте. Функции приводятся в произвольном порядке, однако они должны соответствовать именам в реализации расширения.

LIBRARY    HelloWorld

DESCRIPTION 'Demonstration of a simple Hello World ISAPI extension'

EXPORTS
    HttpExtensionProc
    GetExtensionVersion
Листинг 5.1. HelloWorld.def Content