Доступ к реестру средствами API
Доступ к реестру средствами API
Доступ к реестру средствами API Создать подраздел в реестре: RegCreateKey (Key:HKey; SubKey: PChar; var Result: HKey): Longint; * Key - указывает на "корневой" раздел реестра, в Delphi1 доступен только один - HKEY_CLASSES_ROOT, а в Delphi3 - все. * SubKey - имя раздела - строится по принципу пути к файлу в DOS (пример subkey1subkey2 ...). Если такой раздел уже существует, то он открывается. * В любом случае при успешном вызове 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; * Удалить подраздел KeySubKey. * Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок. Получить имена всех подразделов раздела Key: RegEnumKey(Key:HKey; index: Longint; Buffer: PChar; cb: Longint): Longint; * Key - Handle на открытый или созданный раздел * Buffer - указатель на буфер * cb - размер буфера * index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой Возвращает текстовую строку, связанную с ключом KeySubKey: RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint; * Ключподключ KeySubKey. * Value - буфер для строки * cb - размер, на входе - размер буфера, на выходе - длина возвращаемой строки. * Возврат - код ошибки. Задать новое значение ключу KeySubKey: RegSetValue(Key: HKey; SubKey: PChar; ValType: Longint; Value: PChar; cb: Longint): Longint; * Ключподключ KeySubKey. * 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;