1f190833

CGI


Все это, конечно, хорошо - но что мы с этого имеем? Практически ничего - ведь точно такой же результат мы бы получили, если бы просто набрали в браузере адрес: D:\Projects\HTMLProjects\MySite\Index.html. И, естественно, тот аргумент, что www.test.com/index.html набирать быстрее, устроит не всех (вернее, всех не устроит). К счастью, разрабатываем сервер мы сами - значит, можем внедрять в него все, что нам угодно: Standalone CGI, WinCGI, ISAPI (NSAPI), Apache CGI, PHP, Perl, Python, MySQL…

В этой главе мы остановимся именно на разработке поддержки Standalone CGI.

Итак. StandaloneCGI - программа, работающая под DOS или Windows (и не только, можно и под Linux, только для этого придется перекомпилировать наш сервер), которая при запуске выдает в устройство стандартного вывода требующуюся информацию. Все необходимые параметры передаются ей посредством переменных окружения.

Принцип работы сервера с такими программами таков:

  • задать необходимые переменные окружения;
  • запустить программу;
  • перенаправить результат из стандартного вывода на другой объект (например, в файл);
  • закрытие программы: Закрывается автоматически после вывода всей информации;
  • передать содержимое созданного файла клиенту;
  • удалить файл.

Для того чтобы не засорять память ненужными переменными окружения, воспользуемся функцией запуска приложений CreateProcess, которая перед запуском приложения создает для него частное адресное пространство со своими переменными окружения, которое освобождается после завершения процесса.

Прототип этой функции выглядит так:

function CreateProcess (lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): BOOL; stdcall;

Где:

  • LpApplicationName:PChar - название приложения (плюс полный путь к нему);
  • LpCommandLine:PChar - командная строка приложения (все параметры, которые передаются приложению через командную строку);
  • LpProcessAttributes, lpThreadAttributes - в нашем случае NIL (подробнее об этих параметрах читайте Win32 help);
  • BInheritHandles:Bool - в наше случае False;
  • DwCreationFlags - CREATE_NEW_PROCESS_GROUP или DETACHED_PROCESS;
  • LpEnvirounment:Pointer - указатель на строку, которая содержит переменные окружения, необходимые нашей программе;
  • LpCurrentDirectory:PChar - рабочий каталог нашей программы;
  • LpStartupInfo:TStartupInfo - параметры запуска приложения;
  • LpProcessInformation:TProcessInformation - переменная, в которую помещаются все дескрипторы запущенного приложения.

Результат: True - если приложение нормально напустилось, и False - в противном случае.



Начало  Назад  Вперед