Интернет решения от доктора Боба - страница 17
Нажатие на клавишу "Get Result" посылает информацию на Web сервер, котрый запускает delbooks.exe приложение с информацией введенной на форме. В нашем случае это может быть DELPHI="2", LEVEL="3", TITLE="", AUTHOR="Bob_Swart", PUBLISHER="" и ISBN="" (символ подчеркивания здесь означает пробел). Delphi 2 CGI приложение delbooks.exe обрабатывает полученную информацию, выполняет запрос и генерирует динамическую HTML страницу, которую отправляет на стандартный вывод. Web затем отправляет ее клиенту в его Webбраузеру который отображает ее на экране.
2.2.3. Переменные среды
Стандартное CGI приложение должно анализировать переменные среды для определения метода передачи и размера посылаемой информации через стандартный ввод. Для получения списка переменных среды я всегда использую простой компонент, который я написал очень давно и компилирую его с помощью директив условной компиляции, как в Дельфи 1, так и в Дельфи 2.
> unit TBDosEnv;
> interface
> uses
> SysUtils, WinTypes, WinProcs, Classes;
> type
> TBDosEnvironment = class(TComponent)
> public
> { Public class declarations (override) }
> constructor Create(AOwner: TComponent); override;
> destructor Destroy; override;
> private
> { Private field declarations }
> FDosEnvList: TStringList;
> protected
> { Protected method declarations }
> function GetDosEnvCount: Word;
> public
> { Public interface declarations }
> function GetDosEnvStr(Const Name: String): String;
> { This function is a modified version of the GetEnvVar function that
> appears in the WinDos unit that comes with Delphi. This function's
> interface uses Pascal strings instead of null-terminated strings.
> }
> property DosEnvCount: Word read GetDosEnvCount;
> property DosEnvList: TStringList read FDosEnvList;
> end;
> implementation
> constructor TBDosEnvironment.Create(AOwner: TComponent);
> var P: PChar;
> i: Integer;
> begin
> inherited Create(AOwner);
> FDosEnvList := TStringList.Create;
> {$IFDEF WIN32}
> P := GetEnvironmentStrings;
> {$ELSE}
> P := GetDosEnvironment; { Win API }
> {$ENDIF}
> i := 0;
> while P^ <> #0 do
> begin
> Inc(i);
> FDosEnvList.Add(StrPas(P));
> Inc(P, StrLen(P)+1) { Fast Jump to Next Var }
> end;
> end{Create};
> destructor TBDosEnvironment.Destroy;
> begin
> FDosEnvList.Free;
> FDosEnvList := nil;
> inherited Destroy
> end{Destroy};
> function TBDosEnvironment.GetDosEnvCount: Word;
> begin
> Result := 0;
> if Assigned(FDosEnvList) then Result := FDosEnvList.Count
> end{GetDosEnvCount};
> function TBDosEnvironment.GetDosEnvStr(Const Name: String): String;
> var i: Integer;
> Tmp: String;
> begin
> i := 0;
> Result := '';
> if Assigned(FDosEnvList) then while i
> begin
> Tmp := FDosEnvList[i];
> Inc(i);
> if Pos(Name,Tmp) = 1 then
> begin
> Delete(Tmp,1,Length(Name));
> if Tmp[1] = '=' then
> begin
> Delete(Tmp,1,1);
> Result := Tmp;
> i := FDosEnvList.Count { end while-loop }
> end
> end
> end
> end{GetDosEnvStr};
> end.
Данный компонент получает список переменных среды во время своего создания. Свойство DosEnvCount и DosEnvList является свойством только для чтения и поэтому лучше его создавать его в на ходу, а не бросать на форму, так как берется только 'свежий' список переменных среды, а не загружается из .DFM файла).
2.2.4. Анализ
Среди переменных среды есть переменная с именем REQUEST_METHOD. Она должна иметь значение POST для нашего примера (Я не люблю другие методы). Затем мы должны найти размер информации, которая передана нам. Для этого мы должны получить переменную CONTENT_LENGTH. Сама информация поступает к нам через стандартный ввод (без маркера конца файла, поэтому наша задача не пытаться читать больше, чем нам передано). Данные поступающие через стандартный ввод имеют следующую форму FIELD=VALUE и разделяется с помощью символа '&'. Например: AUTHOR="Bob_Swart"&. Поскольку мы имеем весь входной поток, как одну длинную строку, то мы можем быстро найти параметр AUTHOR с помощью следующей функции: