Как работать с реестром средствами API?

=== Как работать с реестром средствами API? ===
Реестр предназначен для хранения системных переменных и позволяет зарегистрировать файлы программы, что обеспечивает их показ в проводнике с соответствующей иконкой, вызов программы при щелчке на этом файле, добавление ряда команд в меню, вызываемое при нажатии правой кнопки мыши над файлом. Кроме того, в реестр можно внести некую свою информацию (переменные, константы, данные о инсталлированной программы ...). Программу можно добавить в список деинсталляции, что позволит удалить ее из менеджера "Установка/Удаление программ" панели управления.
Для работы с реестром применяется ряд функций API:
==== RegCreateKey - Создать раздел в реестре ====
function RegCreateKey(hKey: HKEY; lpSubKey: PChar; var phkResult: HKEY): Longint;
* hKey - указывает на "корневой" раздел реестра, в Delphi1 доступен только один - HKEY_CLASSES_ROOT, а в Delphi3 - все.
* lpSubKey - имя подраздела - строится по принципу пути к файлу в DOS (пример subkey1\subkey2\ ...). Если такой раздел уже существует, то он открывается.
* phkResult - при успешном вызове содержит Handle на раздел.
Об успешности вызова судят по возвращаемому значению, если ERROR_SUCCESS, то успешно, если иное - ошибка.
==== RegOpenKey - Открыть раздел реестра ====
function RegOpenKey(hKey: HKEY; lpSubKey: PChar; var phkResult: HKEY): Longint;
* hKey - Handle на корневой или открытый ранее раздел
* lpSubKey - имя подраздела
* phkResult - Возвращает Handle на ветку. Если ветки с таким именем нет, то она не создается.
Возврат - код ошибки или ERROR_SUCCESS, если успешно.
==== RegCloseKey - Закрывает раздел ====
function RegCloseKey(hKey: HKey): Longint;
Закрывает раздел, на который ссылается hKey.
Возврат - код ошибки или ERROR_SUCCESS, если успешно.
==== RegDeleteKey - Удалить раздел ====
function RegDeleteKey(hKey: HKEY; lpSubKey: LPCSTR): LONG;
* hKey - Handle на корневой или открытый ранее раздел
* lpSubKey - имя подраздела
Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
==== RegEnumKey - Получить имена всех подразделов раздела ====
function RegEnumKey(hKey: HKEY; dwIndex: DWORD; lpName: LPSTR; cbName: DWORD): LONG;
* hKey - Handle на корневой или открытый ранее раздел
* dwIindex - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой
* lpName - указатель на буфер строки
* cbName - размер буфера строки
==== RegQueryValue - Возвращает текстовое значение параметра ====
function RegQueryValue(hKey: HKEY; lpSubKey: PChar; lpValue: PChar; var lpcbValue: Longint): Longint;
* hKey - Handle на открытый или созданный раздел
* lpSubKey - имя параметра
* lpValue - буфер для строки
* lpcbValue - размер, на входе - размер буфера, на выходе - длина возвращаемой строки.
Возврат - код ошибки или ERROR_SUCCESS.
==== RegSetValue - Задать новое значение параметру ====
function RegSetValue(hKey: HKEY; lpSubKey: LPCSTR; dwType: DWORD; lpData: LPCSTR; cbData: DWORD): LONG;
* hKey - Handle на открытый или созданный раздел
* lpSubKey - имя параметра
* dwType - тип задаваемой переменной,
* lpData - буфер для переменной
* cbData - размер буфера. В Windows 3.1 допустимо только Value=REG_SZ.
Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
==== RegDeleteValue - Удаляет параметр раздела ====
function RegDeleteValue(hKey: HKEY; lpValueName: LPCSTR): LONG;
* hKey - Handle на открытый или созданный раздел. Key должен был быть открыт с доступом KEY_SET_VALUE процедурой RegOpenKey.
* lpValueName - имя параметра, находящегося в разделе Key.
Возвращает ERROR_SUCCESS если успешно.
==== RegEnumValue - Выдает список параметров раздела ====
function RegEnumValue(hKey: HKEY; dwIndex: DWORD; lpValueName: LPSTR;
 lpcbValueName: LPDWORD; lpReserved: LPDWORD; lpType: LPDWORD; lpData: LPBYTE;
 lpcbData: LPDWORD): LONG;
* hKey - Handle на открытый или созданный раздел.
* 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;
Source: Взято с http://delphiworld.narod.ru
----
* Облегчённый вариант класса TRegistry
ID: 02269
Category:Справочники