"Интернет решения от доктора Боба" - читать интересную книгу автора (Swart Bob)

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^ lt;gt; #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 lt;FDosEnvList.Count gt;do

     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 файла).