functionReadIni(ASection, AString : String) : String;
var
sIniFile: TIniFile;
sPath : String[60];
begin
GetDir(0,sPath);
sIniFile := TIniFile.Create(sPath + '\Name.INI');
Result := sIniFile.ReadString(ASection, AString, S);
sIniFile.Free;
end;
procedureWriteIni(ASection, AString, AValue: String);
var
sIniFile: TIniFile;
sPath : String[60];
begin
GetDir(0,sPath);
sIniFile := TIniFile.Create(sPath + '\Name.INI');
sIniFile.WriteString(ASection, AString, AValue);
sIniFile.Free;
end;
Дополненный TRegistry, умеет работать с значениями типа REG_MULTI_SZ (Windows NT, Windows 2000)
Кондратюк Виталийсоветует:
unitReg;
{$R-,T-,H+,X+}
interface
usesRegistry, Classes, Windows, Consts, SysUtils;
typeTReg = class(TRegistry)
public
procedureReadStringList( constname : string; list : TStringList);
procedureWriteStringList( constname : string; list : TStringList);
end;
implementation
//*** TReg *********************************************************************
//------------------------------------------------------------------------------
// Запись TStringList ввиде значения типа REG_MULTI_SZ в реестр
//------------------------------------------------------------------------------
procedureTReg.WriteStringList( constname : string; list : TStringList);
var
Buffer : Pointer;
BufSize : DWORD;
i, j, k : Integer;
s : string;
p : PChar;
begin
{подготовим буфер к записи}
BufSize := 0;
fori:=0 tolist.Count-1 do inc(BufSize, Length(list[i])+1);
inc(BufSize);
GetMem(Buffer, BufSize);
k := 0;
p := Buffer;
fori:=0 tolist.Count-1 do begin
s := list[i];
forj:=0 toLength(s)-1 do begin
p[k] := s[j+1];
inc(k);
end;
p[k] := chr(0);
inc(k);
end;
p[k] := chr(0);
{запись в реестр}
ifRegSetValueEx(CurrentKey, PChar(name), 0, REG_MULTI_SZ, Buffer, BufSize) <> ERROR_SUCCESS then raiseERegistryException.CreateResFmt(@SRegSetDataFailed, [name]);
end;
//------------------------------------------------------------------------------
// Чтение TStringList ввиде значения типа REG_MULTI_SZ из реестра
//------------------------------------------------------------------------------
procedureTReg.ReadStringList( constname : string; list : TStringList);
var
BufSize,DataType: DWORD;
Len, i: Integer;
Buffer: PChar;
s: string;
begin
iflist = nil thenExit;
{чтение из реестра}
Len := GetDataSize(Name);
ifLen < 1 thenExit;
Buffer := AllocMem(Len);
ifBuffer = nil thenExit;
try
DataType := REG_NONE;
BufSize := Len;
ifRegQueryValueEx(CurrentKey, PChar(name), nil, @DataType, PByte(Buffer), @BufSize) <> ERROR_SUCCESS then raiseERegistryException.CreateResFmt(@SRegGetDataFailed, [name]);
ifDataType <> REG_MULTI_SZ then raiseERegistryException.CreateResFmt(@SInvalidRegType, [name]);
{запись в TStringList}
list.Clear;s := '';
fori:=0 toBufSize-2 do begin
// BufSize-2 т.к. последние два нулевых символа
ifBuffer[i] = chr(0) then begin
list.Add(s);
s := '';
end else s := s + Buffer[i];
end;
finally
FreeMem(Buffer);
end;
end;
end.
Как я могу определить доступные сервера приложений на этой машине через Registry?
Nomadicсоветует:
Прочитайте ключ под HKEY_CLASSES_ROOT\CLSID\*, просматривая его насчёт ключей, которые имеют подключ "Borland DataBroker". Эти вхождения и являются серверами приложений.
Ниже пример, который загружает имена доступных серверов приложений в Listbox:
usesRegistry;
procedureTForm1.FormCreate(Sender: TObject);
var
I: integer;
TempList: TStringList;
begin
TempList := TStringList.Create;
try
with TRegistry.Create do try
RootKey := HKEY_CLASSES_ROOT;
ifOpenKey('CLSID', False) thenGetKeyNames(TempList);
CloseKey;
forI := 1 toTempList.Count - 1 do
ifKeyExists('CLSID\' + TempList[I] + '\Borland DataBroker') then begin
ifOpenKey('CLSID\' + TempList[I] + '\ProgID', False) then begin
Listbox1.Items.Add(ReadString(''));
CloseKey;
Читать дальше