Советы по Delphi

       

Получение переменных окружения DOS I


Какие функции Windows API позволяют получить переменные DOS?

Функция GetEnvironmentStrings возвращает адрес памяти со средой текущего процесса. Все переменные возвращаются в виде строк, оканчивающихся нулем. Набор строк терминируется двумя нулями.

Функция GetEnvironmentVariable возвращает значения переменных среды опрашиваемого процесса. Величина также возвращается в виде строки с завершающим нулем.

[000016]
...я понял что это безумно трудно, но неужели нет какого-нибудь более простого решения для получения доступа к переменным среды DOS?

Попробуйте мой компонент, код которого я публикую ниже:

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]



Содержание раздела