Как работать с реестром средствами 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