ISAPI DLL: их разработка и использование (ч.1)

автор: 1999 Александр Качанов
перевод: n|a

Чаще всего для выполнения каких-либо операций на сервере используется интерфейс CGI и CGI-программы, либо CGI-скрипты. Компания Microsoft, как всегда, предложила свой вариант исполнения серверных программ, который называется стандарт ISAPI. И в первую очередь он предназначался для подключения к ведущему Web-серверу Microsoft - Internet Information Server. Программы, написанные по этому стандарту, представляют собой давно известные нам динамически загружаемые библиотеки DLL, которые вызываются Web-сервером, загружаются в память и становятся как бы частью этого Web-сервера, расширяя или изменяя его функциональность.

В ответ на вызов Microsoft компания Netscape разработала свой стандарт NSAPI для своего Web-сервера. Так что война броузеров теперь дополнилась войной серверов. Для программиста же нет принципиальной разницы под какой стандарт разрабатывать dll. Компилятор Delphi (а именно на разработку DLL в среде Delphi сделан акцент в этой статье) сам выполняет всю черновую работу за вас.

Откомпилированная dll помещается в тот же каталог скриптов (SCRIPTS или CGI-BIN) на Web-сервере, куда выкладываются обычно прочие серверные скрипты. Вызов на исполнение этой dll выглядит так же, как и вызов на исполнение любого другого серверного приложения/скрипта. Вот как, например, выглядит запрос на запуск некой программы format.dll:

http://www.microsoft.com/cgi-bin/format.dll?disk=c

Преимущества ISAPI - в скорости выполнения операций. Программа загружается всего один раз и остается в памяти до тех пор, пока ее не выгрузят насильно или пока не остановят Web-сервер. Поэтому ISAPI-dll работает быстрее, чем обычная CGI-программа (которая должна всякий раз загружаться и выгружаться) или скрипт (который сначала должен загружаться, потом обрабатываться интерпретатором, которому тоже нужно время загрузиться). Основные недостатки - трудности при отладке, незамеченная ошибка может привести к зависанию не только самой dll, но и Web-сервера, частью которого она является. Самый главный недостаток - непереносимость. Если Perl-скрипт может выполняться как на UNIX платформе, так и на Windows-платформе, то dll, сами понимаете, намертво привязана к Windows.

Впрочем некоторые из этих трудностей можно побороть.

Apache vs IIS

Как ни странно, но ISAPI-dll может работать не только под IIS (для которого и затевался весь сыр-бор), но и под бесплатным сервером Apache. Хочется сразу предупредить о глюке, с которым вы можете столкнуться при разработке ISAPI-dll в среде Delphi.

Дело в том, что при запуске вашей dll Apache вызывает главную функцию GetExtensionVersion и проверяет ее выполнение на True/False в ожидании, что ему вернется значение 1 или 0. А в Delphi значение True выражается не 1, а -1. В результате ваша ISAPI-dll, будет прекрасно работать под IIS, но ни за что не заработает под Apache, выдавая сообщение:

No such file or directory: ISAPI GetExtensionVersion() failed

Решение таково: вам надо взять исходные тексты Apache и внести в них маленькое изменение в файле mod_isapi.c:

Строку

if ((*isapi_version)(pVer) != TRUE) {
заменить на
if (!(*isapi_version)(pVer)) {

и заново скомпилировать Apache.

Не так все страшно, как кажется. Моих скромных навыков хватило, чтобы установить Visual C++ 6.0, открыть в нем проект, отыскать нужную строчку, перекомпилировать все и получить работающий Apache. Если это смог сделать я, сможете и вы. Если вы вообще не разбираетесь в С, попросите сделать это знакомого программиста.

1. Введение
2. Отладка и разработка 

Rambler's Top100
Rating All.BY
Akavita
Valid XHTML 1.0!