Как работать с реестром средствами API?
Материал из DRKB
Как работать с реестром средствами 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
ID: 02269