Функция GetEnvironmentStrings возвращает адрес памяти со средой текущего процесса. Все переменные возвращаются в виде строк, оканчивающихся нулем. Набор строк терминируется двумя нулями.
Функция GetEnvironmentVariable возвращает значения переменных среды опрашиваемого процесса. Величина также возвращается в виде строки с завершающим нулем.
[000016]Попробуйте мой компонент, код которого я публикую ниже:
unit TDosEnv;interfaceusesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs; typeTDosEnvironment = class(TComponent)public{ Public объявления класса }constructor Create(AOwner: TComponent); override;destructor Destroy; override; private{ Объявления Private-полей }FDosEnvList: TStringList;procedure DoNothing(Const Value: TStringList); protected{ Объявления Protected-методов }dummy: Word;function GetDosEnvCount: Word; public{ Public interface объявления }function GetDosEnvStr(Const Name: String): String;{ Данная функция является измененной версией функции GetEnvVar,присутствующей в поставляемом с Delphi модуле WinDos. Онаиспользует паскалевские строки вместо строк с терминирующим нулем.} published{ Published design объявления }property DosEnvCount: Word read GetDosEnvCount write dummy;property DosEnvList: TStringList read FDosEnvList write DoNothing;end; procedure Register; implementation constructor TDosEnvironment.Create(AOwner: TComponent);var P: PChar;i: Integer;begininherited Create(AOwner);FDosEnvList := TStringList.Create;P := GetDosEnvironment; { Win API }i := 0;while P^ <> #0 dobeginInc(i);FDosEnvList.Add(StrPas(P));Inc(P, StrLen(P)+1) { Быстрый переход к следующей переменной }endend {Create}; destructor TDosEnvironment.Destroy;beginFDosEnvList.Free;FDosEnvList := nil;inherited Destroyend {Destroy}; procedure TDosEnvironment.DoNothing(Const Value: TStringList);beginMessageDlg('TDosEnvironment.DosEnvList только для чтения!', mtInformation,[mbOk], 0) end {DoNothing}; function TDosEnvironment.GetDosEnvCount: Word;{ Возвращает количество переменных окружения.}beginif Assigned(FDosEnvList) then {!!} Result := FDosEnvList.CountelseResult := 0;end {GetDosEnvCount}; function TDosEnvironment.GetDosEnvStr(Const Name: String): String;{ Данная функция является измененной версией функции GetEnvVar,присутствующей в поставляемом с Delphi модуле WinDos. Онаиспользует паскалевские строки вместо строк с терминирующим нулем.}var i: Integer;Tmp: String;Len: Byte absolute Name;begini := 0;Result := '';if Assigned(FDosEnvList) then {!!} while i < FDosEnvList.Count dobeginTmp := FDosEnvList[i];Inc(i);if Pos(Name,Tmp) = 1 thenbeginDelete(Tmp,1,Len);if Tmp[1] = '=' thenbeginDelete(Tmp,1,1);Result := Tmp;i := FDosEnvList.Count { конец while-цикла }endendendend {GetDosEnvStr}; procedure Register;beginRegisterComponents('Dr.Bob', [TDosEnvironment]);end {Register}; end. |
Успехов, Dr. Bob (drbob@pi.net) [000710]