О реестре

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

«Что такое Реестр?» — такой вопрос задают начинающие программёры, в то время, когда более опытные уже знают, что это ключ ко многим системным установкам маст-дая. (для чайников: маст-дай — от англ. must die, т.е. «должен умереть» — имеется ввиду операционная система Windows).

Реестр — это системная база данных. Получить доступ к ней можно написав в командной строке («ПУСК > «Выполнить») слово «RegEdit» — при этом запуститься программа для редактирования реестра. Окно этой программы поделено на две части. В левой (более узкой панели) показана древовидная структура ключей. Ключ — это раздел, отвечающий за какие-либо установки. Сами установки называются параметрами, находящимися в правой панели. Каждый параметр имеет своё имя, значение и тип. Параметры бывают строкового типа, двоичного и типа DWORD. Их очень много, но их назначение зависит от того, в каком ключе находится той или иной параметр. Ключи делятся между шестью основными разделами:

HKEY_CLASSES_ROOT — Содержит информацию об OLE, операциях перетаскивания (drag-and-drop — с англ. перетащить-и-отпустить) и ярлыках. В данном разделе можно так же указать программы, запускаемые при активизации файлов определённого типа. Данный раздел является псевдонимом для ветви HKEY_LOCAL_MACHINE\Software\Classes

HKEY_CURRENT_USER — Содержит индивидуальные установки для каждого пользователя, зарегистрированного в системе. Данный раздел является псевдонимом для ветви HKEY_USERS

HKEY_LOCAL_MACHINE — Содержит аппаратные и программные установки, необходимые для функционирования оборудования и программ. Данный раздел так же хранит конфигурацию Windows.

HKEY_USERS — Содержит установки пользователей и соответствующие конфигурационные данные, такие как цвет окна, расположение элементов на рабочем столе, обои, заставки.

HKEY_CURRENT_CONFIG — Содержит информацию о текущем аппаратном профиле. Если вы не используете аппаратные профили, данный раздел содержит установки Windows по умолчанию.

HKEY_DYN_DATA — В отличие от других разделов, которые хранят статистические данные (неизменяющиеся во время сеанса), данный раздел содержит указатели на динамические данные (постоянно изменяющиеся во время работы компьютера). Windows использует данный раздел для отслеживания профилей оборудования plug-and-play, статистики по производительности и драйверов виртуальных устройств VxD.

Все данные системного реестра заключаются в двух файлах, находящихся в директории Windows — это System.dat и User.dat.

{/codecitation}

Как поместить программу в автозапуск

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Это можно сделать несколькими способами, но наиболее оптимальный — занесение файла в автозапуск реестра, который находится по следующему адресу:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

uses Registry;

procedure TForm1.FormCreate(Sender: TObject);

var

// Переменная реестра

h: TRegistry;

begin

h := TRegistry.Create;

with h do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey(‘\Software\Microsoft\Windows\CurrentVersion\Run’, true);

WriteString(‘DelphiWorldApp’, ‘C:\Application.exe’);

CloseKey;

Free;

end;

end;

{/codecitation}

Как получить список инсталлированных программ

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: http://www.swissdelphicenter.ch

uses

Registry;

procedure TForm1.Button1Click(Sender: TObject);

const

UNINST_PATH = ‘SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall’;

var

Reg: TRegistry;

SubKeys: TStringList;

ListItem: TlistItem;

i: integer;

sDisplayName, sUninstallString: string;

begin

{

ListView1.ViewStyle := vsReport;

ListView1.Columns.add;

ListView1.Columns.add;

ListView1.Columns[0].caption := ‘DisplayName’;

ListView1.Columns[1].caption := ‘UninstallString’;

ListView1.Columns[0].Width := 300;

ListView1.Columns[1].Width := 300;

}

Reg := TRegistry.Create;

with Reg do

try

with ListView1.Items do

try

BeginUpdate;

Clear;

RootKey := HKEY_LOCAL_MACHINE;

if OpenKeyReadOnly(UNINST_PATH) then

begin

SubKeys := TStringList.Create;

try

GetKeyNames(SubKeys);

CloseKey;

for i := 0 to subKeys.Count — 1 do

if OpenKeyReadOnly(Format(‘%s\%s’, [UNINST_PATH, SubKeys[i]])) then

try

sDisplayName := ReadString(‘DisplayName’);

sUninstallString := ReadString(‘UninstallString’);

if sDisplayName » then

begin

ListItem := Add;

ListItem.Caption := sDisplayName;

ListItem.subitems.Add(sUninstallString);

end;

finally

CloseKey;

end;

finally

SubKeys.Free;

end;

end;

finally

ListView1.AlphaSort;

EndUpdate;

end;

finally

CloseKey;

Free;

end;

end;

{/codecitation}

Как получить имя программы, с которой ассоциировано то или иное расширение

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Олег Кулабухов

Юзер подходит к программисту и спрашивает:

— У меня почемуто пейджмейкеровский файл в ворде не открывается.

— И не откроется, там же расширения разные.

— Так я его переименовал.

uses

{$IFDEF WIN32}

Registry; {We will get it from the registry}

{$ELSE}

IniFiles; {We will get it from the win.ini file}

{$ENDIF}

{$IFNDEF WIN32}

const

MAX_PATH = 144;

{$ENDIF}

function GetProgramAssociation(Ext: string): string;

var

{$IFDEF WIN32}

reg: TRegistry;

s: string;

{$ELSE}

WinIni: TIniFile;

WinIniFileName: array[0..MAX_PATH] of char;

s: string;

{$ENDIF}

begin

{$IFDEF WIN32}

s := »;

reg := TRegistry.Create;

reg.RootKey := HKEY_CLASSES_ROOT;

if reg.OpenKey(‘.’ ext ‘\shell\open\command’,

false) false then

begin

{The open command has been found}

s := reg.ReadString(»);

reg.CloseKey;

end

else

begin

{perhaps thier is a system file pointer}

if reg.OpenKey(‘.’ ext,

false) false then

begin

s := reg.ReadString(»);

reg.CloseKey;

if s » then

begin

{A system file pointer was found}

if reg.OpenKey(s ‘\shell\open\command’,

false) false then

{The open command has been found}

s := reg.ReadString(»);

reg.CloseKey;

end;

end;

end;

{Delete any command line, quotes and spaces}

if Pos(‘%’, s) > 0 then

Delete(s, Pos(‘%’, s), length(s));

if ((length(s) > 0) and

(s[1] = ‘»‘)) then

Delete(s, 1, 1);

if ((length(s) > 0) and

(s[length(s)] = ‘»‘)) then

Delete(s, Length(s), 1);

while ((length(s) > 0) and

((s[length(s)] = #32) or

(s[length(s)] = ‘»‘))) do

Delete(s, Length(s), 1);

{$ELSE}

GetWindowsDirectory(WinIniFileName, sizeof(WinIniFileName));

StrCat(WinIniFileName, ‘\win.ini’);

WinIni := TIniFile.Create(WinIniFileName);

s := WinIni.ReadString(‘Extensions’,

ext,

»);

WinIni.Free;

{Delete any command line}

if Pos(‘ ^’, s) > 0 then

Delete(s, Pos(‘ ^’, s), length(s));

{$ENDIF}

result := s;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(GetProgramAssociation(‘gif’));

end;

{/codecitation}

Как можно определить доступные сервера приложений на этой машине через Registry

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Nomadic

Встречаются два системных администратора, и один спрашивает другого:

— Ты чего такой грустный?

— Да вот сервер вчера «упал».

— Ну да ты что, его до сих пор не «поднял»?

— Поднял, но он со стола упал…

Прочитайте ключ под HKEY_CLASSES_ROOT\CLSID\*, просматривая его насчёт ключей, которые имеют подключ «Borland DataBroker». Эти вхождения и являются серверами приложений.

Ниже пример, который загружает имена доступных серверов приложений в Listbox:

uses Registry;

procedure TForm1.FormCreate(Sender: TObject);

var

I: integer;

TempList: TStringList;

begin

TempList := TStringList.Create;

try

with TRegistry.Create do

try

RootKey := HKEY_CLASSES_ROOT;

if OpenKey(‘CLSID’, False) then

GetKeyNames(TempList);

CloseKey;

for I := 1 to TempList.Count — 1 do

if KeyExists(‘CLSID\’ TempList[I] ‘\Borland DataBroker’) then

begin

if OpenKey(‘CLSID\’ TempList[I] ‘\ProgID’, False) then

begin

Listbox1.Items.Add(ReadString(»));

CloseKey;

end;

end;

finally

Free;

end;

finally

TempList.Free;

end;

end;

{/codecitation}

Использование реестра

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: Алексей Федоров

Реестр — это центральное хранилище информации о параметрах системы и установленных программах. В версиях Windows до Windows 95 программисты сохраняли параметры программ либо в INI-файлах WIN.INI и SYSTEM.INI, либо в дополнительных INI-файлах. Хотя использование INI-файлов поддерживается и в Win32, Microsoft настоятельно рекомендует для хранения необходимых в работе программы параметров пользоваться реестром. Реестр представляет собой иерархическую базу данных, cостоящую из секций, подсекций и элементов. Каждая секция имеет свое назначение. Хранить данные о пользовательских программах Microsoft рекомендует в секции HKEY_CURRENT_USER и подсекции Software. В этой подсекции вы создаете подсекцию, идентифицирующую вашу программу или фирму, и уже внутри нее располагаете данные.

Модуль Registry

Для упрощения работы с регистратором в состав Delphi (начиная с версии 2.0) входит модуль REGISTRY, содержащий реализацию трех классов, — TRegistry, TRegistryIniFile и TRegIniFile.

Внимание! Чтобы использовать свойства и методы классов TRegistry, TRegistryIniFile и TRegIniFile, необходимо включить в список uses модуль Registry.

TRegIniFile

Собственно говоря, задача класса TRegIniFile — упростить перенос 16-битных программ в среду Windows 95. Методы этого класса эквивалентны методам класса TIniFile в 16-битной версии Delphi. Класс TRegIniFile позволяет обращаться к секции HKEY_CURRENT_USER, считывать и записывать строки (методы ReadString и WriteString), целочисленные значения (методы ReadInteger и WriteInteger), логические значения (методы ReadBool и WriteBool), секции (методы ReadSection, ReadSections и ReadSectionValues), удалять секции (метод EraseSection) и элементы (метод DeleteKey). Рассмотрим на примерах, как используются функции этого класса.

Microsoft рекомендует записывать данные, относящиеся к вашей программе, в подсекции секции HKEY_CURRENT_USER_Software. Предположим (не особенно фантазируя на эту тему), что ваша программа называется RegDemo, и данные для нее располагаются в секции Software\RegDemo. Ниже мы покажем, как поместить в регистратор строчные, целочисленные и логические данные, а затем считать их, — этих операций будет достаточно для того, чтобы сохранить в регистраторе параметры нашей программы, а затем считать их.

Прежде чем записать данные в определенную секцию, ее необходимо создать. Это происходит при вызове конструктора объекта TRegIniFile. В качестве параметра вы указываете название секции, и если таковой не существует, она создается:

RegFile := TRegIniFile.Create(SubKey);

После того как файл регистратора открыт (и создана определенная секция), мы можем записать данные. Поддерживаются три типа данных: целочисленные, логические и строчные данные. Для записи этих данных существуют методы WriteInteger, WriteBool и WriteString. В качестве параметров указываются:

название подсекции;

название элемента;

записываемые данные.

Так, чтобы записать значение элемента MyIntVal в подсекции IntKey, следует выполнить код

RegFile.WriteInteger(IntKey, ‘Int_Val’, 32000);

а для того чтобы прочесть значение, необходимо вызвать метод ReadInteger (в качестве параметров указываются название подсекции, название элемента и значение по умолчанию):

RegFile.ReadInteger(IntKey, ‘Int_Val’, 0));

Для чтения логических и строчных данных используются соответственно методы ReadBool и ReadStr, а для их записи – методы WriteBool и WriteString.

Расссмотрим пример использования перечисленных выше методов класса TRegIniFile. Расположим в форме компонент Memo, две группы GroupBox и шесть кнопок – три в группе Write и три в группе Read. Нажатие каждой кнопки в группе Write приведет к записи соответствующего значения в реестр, нажатие каждой кнопки в группе Read – к чтению этого значения.

Ниже приведен исходный текст модуля, в котором содержатся обработчики нажатия кнопок, использующие методы класса TRegIniFile.

unit RDUnit;

interfaceuses

Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls, Registry;

type

TForm1 = class(TForm)

Memo1: TMemo;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

Label1: TLabel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

Button6: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure FormClose(Sender: TObject;

var Action: TCloseAction);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation{$R *.DFM}var

RegFile: TRegIniFile;

const

//Подсекция

SubKey: string = ‘Software\RegDemo’;

// Элемент для хранения логических данных

BoolKey: string = ‘BoolKey’;

// Элемент для хранения целочисленных данных

IntKey: string = ‘IntKey’;

// Элемент для хранения строчных данных

StrKey: string = ‘StrKey’;

procedure TForm1.FormCreate(Sender: TObject);

begin

// Создать экземпляр класса

RegFile := TRegIniFile.Create(SubKey);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

// Записать целочисленное значение

RegFile.WriteInteger(IntKey, ‘Value’, 1998);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

// Записать булево значение

RegFile.WriteBool(BoolKey, ‘Value’, True);

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

// Записать строку

RegFile.WriteString(StrKey, ‘Value’, ‘Demo’);

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

// Считать целочисленное значение

Memo1.Lines.Add(‘Int Value = ‘

IntToStr(RegFile.ReadInteger(IntKey,

‘Value’, 0)));

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

// Считать булево значение

if RegFile.ReadBool(BoolKey, ‘Value’, False) then

Memo1.Lines.Add(‘Bool Value = True’)

else

Memo1.Lines.Add(‘Bool Value = False’);

end;

procedure TForm1.Button6Click(Sender: TObject);

begin

// Считать строку

Memo1.Lines.Add(RegFile.ReadString(StrKey, ‘Value’, »));

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

// Удалить секцию

RegFile.EraseSection(SubKey);

// Освободить память

RegFile.Free;

end;

end.

На приведенном ниже рисунке показано, как выглядит созданная нами подсекция в редакторе REGEDIT.

Отметим, что рассмотренных выше функций вполне достаточно для того чтобы обеспечить минимальную функциональность приложения. Если же вам требуется читать и записывать данные из других секций реестра, вы можете воспользоваться методами класса TRegistry или (что мене удобно) непосредственно функциями Win32 API.

Класс TRegistry

Прежде чем рассмотреть пример использования свойств и методов класса TRegistry, давайте кратко перечислим их.

В следующей таблице перечислены свойства класса TRegistry.

Свойство Описание

CurrentKey Позволяет узнать текущую подсекцию, в которой проводятся операции по чтению и записи. Для изменения подсекции следует использовать методы OpenKey и OpenKeyReadOnly

CurrentPath Позволяет узнать полное название текущей подсекции

LazyWrite Задает способ обновления информации в реестре – непосредственно или после вызова метода CloseKey.

RootKey Задает корневую секцию в реестре. По умолчанию установлено значение HKEY_CURRENT_USER

В следующей таблице перечислены методы класса TRegistry.

Метод Описание

CloseKey Записывает внесенные изменения и закрывает текущую подсекцию

Create Создает экземпляр класса TRegistry и задает значение корневой секции — HKEY_CURRENT_USER

CreateKey Создает подсекцию

DeleteKey Удаляет подсекцию

DeleteValue Удаляет значение элемента

Destroy Уничтожает ранее созданный экземпляр класса TRegistry

GetDataInfo Возвращает тип данных для указанного элемента

GetDataSize Возвращает размер данных для указанного элемента

GetDataType Возвращает тип данных для указанного элемента

GetKeyInfo Возвращает информацию о текущем элементе

GetKeyNames Возвращает имена подсекций для указанной секции

GetValueNames Возвращает названия элементов для указанной подсекции

HasSubKeys Позволяет узнать, имеются ли подсекции для указанной секции

KeyExists Позволяет узнать, существует ли элемент

LoadKey Создает новую подсекцию и загружает в нее информацию из указанного файла

MoveKey Перемещает указанную подсекцию и все вложенные подсекции в заданное место

OpenKey Открывает подсекцию

OpenKeyReadOnly Открывает подсекцию только для чтения

ReadBinaryData Считывает данные в бинарном формате

ReadBool Считывает данные в булевом формате

ReadCurrency Считывает данные в формате валюты

ReadDate Считывает данные в формате даты

ReadDateTime Считывает данные в формате “дата/время”

ReadFloat Считывает данные в формате с плавающей точкой

ReadInteger Считывает данные в целочисленном формате

ReadString Считывает данные в строчном формате

ReadTime Считывает данные в формате времени

RegistryConnect Устанавливает соединение с реестром на другом компьютере

RenameValue Переименовывает элемент

ReplaceKey Замещает значение элемента значениями из файла

RestoreKey Восстанавливает значение элемента из файла

SaveKey Сохраняет значение элемента в файле

UnLoadKey Удаляет подсекцию, загруженную методом LoadKey

ValueExists Позволяет узнать, существует ли значение у элемента

WriteBinaryData Записывает данные в бинарном формате

WriteBool Записывает данные в булевом формате

WriteCurrency Записывает данные в формате валюты

WriteDate Записывает данные в формате даты

WriteDateTime Записывает данные в формате “дата/время”

WriteExpandString Записывает данные в формате «расширенно» строки

WriteFloat Записывает данные в формате с плавающей точкой

WriteInteger Записывает данные в целочисленном формате

WriteString Записывает данные в строчном формате

WriteTime Записывает данные в формате времени

После того как мы кратко познакомились со свойствами и методами класса TRegistry, давайте рассмотрим несколько примеров их использования.

Инициализация

Перед использованием свойств и методов класса TRegistry, необходимо создать экземпляр этого класса. Например:

var

R: TRegistry;

…R := TRegistry.Create;

Задание корневой секции

Если вы собираетесь работать с секцией, отличной от HKEY_CURRENT_USER (это значение задается по умолчанию), то после инициализации вы должны изменить значение свойства RootKey. Возможны следующие значения:

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

HKEY_PERFORMANCE_DATA

HKEY_CURRENT_CONFIG

HKEY_DYN_DATA

Например:

with R do

begin

RootKey := HKEY_LOCAL_MACHINE;

//

// Продолжаем работу с реестром

//

end;

{/codecitation}

Зарегистрировать новый тип файлов

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Возлюбленная компьютерщика мурлычет ему на ушко:

— Любимый, ну когда, когда мы будем регистрироваться?

— А на хр#на? Я сейчас и так взломаю…

Не хуже M$ получается! У них свои типы файлов, и у нас будут свои! Всё, что для этого нужно — точно выполнять последовательность действий и научиться копировать в буфер, чтобы не писать все те коды, что будут тут изложены :))

Сначала, естественно, объявляем в uses модуль Registry.

uses

Registry;

Затем в публичных объявлениях объявляем процедуру регистрации нового типа файлов:

public

{ Public declarations }

procedure RegisterFileType(ext: string; FileName: string);

Описываем её так:

procedure TForm1.RegisterFileType(ext: string; FileName: string);

var

reg: TRegistry;

begin

reg:=TRegistry.Create;

with reg do

begin

RootKey:=HKEY_CLASSES_ROOT;

OpenKey(‘.’ ext,True);

WriteString(»,ext ‘file’);

CloseKey;

CreateKey(ext ‘file’);

OpenKey(ext ‘file\DefaultIcon’,True);

WriteString(»,FileName ‘,0’);

CloseKey;

OpenKey(ext ‘file\shell\open\command’,True);

WriteString(»,FileName ‘ «%1″‘);

CloseKey;

Free;

end;

end;

Ну а по нажатию какого-нибудь батона регистрируем!

procedure TForm1.Button1Click(Sender: TObject);

begin

RegisterFileType(‘DelphiWorld’, Application.ExeName);

end;

{/codecitation}

Запись строки в реестр без использования класса TRegistry

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Dimka Maslov

WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Запись строки в реестр без использования класса TRegistry

Функция записывает в реестр информацию в виде строки.

Входные параметры:

RootKey — идентификатор корневого раздела реестра, например

HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE и т.д.

Key — имя раздела реестра, если он не существует, то автоматически

создаётся

Name — имя параметра, для записи параметра «По умолчанию» («Default»),

эта строка должна быть пустой

Value — значение параметра

В случае успеха функция возвращает True, или False при возникновении

ошибки записи в реестр

Зависимости: Windows

Автор: Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург

Copyright: Dimka Maslov

Дата: 13 мая 2002 г.

***************************************************** }

function RegWriteStr(RootKey: HKEY; Key, Name, Value: string): Boolean;

var

Handle: HKEY;

Res: LongInt;

begin

Result := False;

Res := RegCreateKeyEx(RootKey, PChar(Key), 0, nil, REG_OPTION_NON_VOLATILE,

KEY_ALL_ACCESS, nil, Handle, nil);

if Res ERROR_SUCCESS then

Exit;

Res := RegSetValueEx(Handle, PChar(Name), 0, REG_SZ, PChar(Value),

Length(Value) 1);

Result := Res = ERROR_SUCCESS;

RegCloseKey(Handle);

end;

{/codecitation}

Записать в реестр данные бинарного вида

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Четыре стадии обнищания программиста:

4. Кормить кошку kitekat-ом.

3. Нет денег на хлеб.

2. Нет денег на женщин.

1. Нет денег на апгрейд.

var

Reg: TRegistry;

buf : array [0..4] of byte;

i: Integer;

begin

Reg := TRegistry.Create;

try

Reg.RootKey := HKEY_CURRENT_USER;

if Reg.OpenKey(‘\Software’, True) then begin

for i:=1 to 4 do buf[i]:=0;

buf[0]:=1;

Reg.WriteBinnaryData(‘Value’, buf, sizeof(buf));

Reg.CloseKey;

end;

finally

Reg.Free;

inherited;

end;

{…}

end;

{/codecitation}

Доступ к реестру средствами API

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

— Как три программиста могут организовать бизнес?

— Один пишет вирусы, а другой антивирусы.

— А третий?

— Операционные системы, под которыми все это работает.

Создать подраздел в реестре:

RegCreateKey (Key:HKey; SubKey: PChar; var Result: HKey): Longint;

Key — указывает на «корневой» раздел реестра, в Delphi1 доступен только один — HKEY_CLASSES_ROOT, а в Delphi3 — все.

SubKey — имя раздела — строится по принципу пути к файлу в DOS (пример subkey1\subkey2\ …). Если такой раздел уже существует, то он открывается.

В любом случае при успешном вызове Result содержит Handle на раздел.

Об успешности вызова судят по возвращаемому значению, если ERROR_SUCCESS, то успешно, если иное — ошибка.

Открыть подраздел:

RegOpenKey(Key: HKey; SubKey: PChar; var Result: HKey): Longint;

Раздел Key

Подраздел SubKey

Возвращает Handle на подраздел в переменной Result. Если раздела с таким именем нет, то он не создается.

Возврат — код ошибки или ERROR_SUCCESS, если успешно.

Закрывает раздел:

RegCloseKey(Key: HKey): Longint;

Закрывает раздел, на который ссылается Key.

Возврат — код ошибки или ERROR_SUCCESS, если успешно.

Удалить подраздел:

RegDeleteKey(Key: HKey; SubKey: PChar): Longint;

Удалить подраздел Key\SubKey.

Возврат — код ошибки или ERROR_SUCCESS, если нет ошибок.

Получить имена всех подразделов раздела Key:

RegEnumKey(Key:HKey; index: Longint; Buffer: PChar; cb: Longint): Longint;

Key — Handle на открытый или созданный раздел

Buffer — указатель на буфер

cb — размер буфера

index — индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование — в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой

Возвращает текстовую строку, связанную с ключом Key\SubKey:

RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint;

Ключ\подключ Key\SubKey.

Value — буфер для строки

cb — размер, на входе — размер буфера, на выходе — длина возвращаемой строки.

Возврат — код ошибки.

Задать новое значение ключу Key\SubKey:

RegSetValue(Key: HKey; SubKey: PChar; ValType: Longint; Value: PChar; cb: Longint): Longint;

Ключ\подключ Key\SubKey.

ValType — тип задаваемой переменной,

Value — буфер для переменной

cb — размер буфера. В Windows 3.1 допустимо только Value=REG_SZ.

Возврат — код ошибки или ERROR_SUCCESS, если нет ошибок.

Удаляет значение lpValueName находящееся в ключе hKey:

RegDeleteValue(HKEY hKey, LPCTSTR lpValueName);

hKey — ключ. hKey должен был быть открыт с доступом KEY_SET_VALUE процедурой RegOpenKey.

lpValueName — значение, находящееся в ключе hKey.

Возвращает ERROR_SUCCESS если успешно.

Выдает список значений у ключа hKey:

LONG RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);

hKey — ключ.

dwIndex — этот параметр должен быть 0 при первом вызове, а далее по анологии с RegEnumKey (т.е. можно использовать в цикле),

lpValueName — буфер для названия значения

lpcbValueName — размер lpValueName

lpReserved должно быть всегда 0

lpType — буфер для названия типа (int)

lpData — буфер для данных

lpcbData-размер для lpData

Примечание:

При каждой новом вызове функции после предыдущего нужно заново переназначить lpcbValueName.

lpcbValueName = sizeof(lpValueName)

Примеры:

{ Создаем список всех подразделов указанного раздела }

procedure TForm1.Button1Click(Sender: TObject);

var

MyKey: HKey; { Handle для работы с разделом }

Buffer: array[0 .. 1000] of char; { Буфер }

Err, { Код ошибки }

index: longint; { Индекс подраздела }

begin

Err := RegOpenKey(HKEY_CLASSES_ROOT, ‘DelphiUnit’, MyKey); { Открыли раздел }

if Err ERROR_SUCCESS then

begin

MessageDlg(‘Нет такого раздела !!’, mtError, [mbOk], 0);

exit;

end;

index := 0;

{Определили имя первого подраздела }

Err := RegEnumKey(MyKey, index, Buffer, Sizeof(Buffer));

while err = ERROR_SUCCESS do { Цикл, пока есть подразделы }

begin

memo1.lines.add(StrPas(Buffer)); { Добавим имя подраздела в список }

inc(index); { Увеличим номер подраздела }

Err := RegEnumKey(MyKey, index, Buffer, Sizeof(Buffer)); { Запрос }

end;

RegCloseKey(MyKey); { Закрыли подраздел }

end;

{/codecitation}