Delphi World - Доступ к реестру средствами API
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Доступ к реестру средствами API


- Как три программиста могут организовать бизнес?
- Один пишет вирусы, а другой антивирусы.
- А третий?
- Операционные системы, под которыми все это работает.

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


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;

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования