Как работать с реестром
Реестр - один из важнейших элементов Windows. Там можно
найти множество настроек Windows и других программ. Сейчас программистов
больше привлекает хранение опций своих программ в реестре нежели в
различных ini файлах. Приемущество очевидно : ini файл можно случайно
изменить, удалить, или повредить какими-либо некоректными действиями; С
записями в реестре это сделать гораздо сложнее... Реестр открывает новые
возможности в программировании, в управлении "чужими" программами и
других действиях. К примеру в реестре можно прописать программы, которые
будут загружаться при старте Windows, но их не будет ни в
:"Автозагрузке" ни в Autoexec.bat..., а в реестре их довольно трудно
найти даже опытному программисту. Так что - дерзайте. Я уверен, что
знание ключевых моментов в этой области значительно облегчит Ваш труд...
Работа с реестром разделяется на несколько этапов.
1. Вы
должны объявить подключение модуля Registry в Uses. 2. Необходимо
создать переменную типа TRegistry и инициализировать ее. 3.
Собственно работа с реестром.
4. Уничтожение переменной.
Uses
..., Registry,...
Var
Reg:Tregistry; // Создание переменной Reg
begin
Reg:=TRegistry.create; // Инициализирование этой же
переменной
//------------ Программа------------
Reg.Destroy;
end;
Пункты 1, 2, 4 - ясны.
Поэтому оставшаяся часть статьй будет посвящена именно 3-му пункту -
работе с реестром. Самое первое дело, после выполнения второго пункта,
это определение корневого ключа реестра. Он определяется с помощью
свойства RootKey переменной Reg.
Корневые ключи реестра:
HKEY_CLASSES_ROOT (по умолчанию) HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE HKEY_USERS HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
Следующие свойства:
CurrentPath:
String; Определяет путь к текущему ключу. CurrentKey: HKEY; Определяет
открытый в настоящее время ключ реестра.
Procedure CloseKey;
Закрывает открытый в данный момент ключ реестра и записывает в
реестра все изменения (если таковые были), произведенные в данном ключе.
Вызов CloseKey несколько раз или при отсутствии открытого ключа не
вызывает ошибки.
function CreateKey(const Key: String): Boolean;
Создает ключ Key (где Key - путь с разделителями "", например
SoftwareTest. Имя корневого ключа в пути не указывается !! Он задается
через property RootKey. Возвращает True при успешном
создании
function DeleteKey(const Key: String): Boolean;
Удалить ключ Key (аналогично CreateKey, только с точностью до
наоборот)
function DeleteValue(const Name: String): Boolean;
Удалить параметр с именем Name текущего ключа. Очевидно, что
предварительно необходимо открыть этот ключ
function
GetDataInfo(const ValueName: String; var Value: TRegDataInfo):
Boolean;
Получить информацию о параметре ValueName текущего ключа
- его тип и размер. При написании программ применяется редко, т.к.
программист и сам знает, какого типа его параметры. А вот при написании
разного рода утилит для просмотра и редактирования реестра он просто
незаменим.
Типы:
TRegDataType = (rdUnknown, rdString,
rdExpandString, rdInteger, rdBinary);
TRegDataInfo = record
RegData: TRegDataType; // Тип ключа
DataSize: Integer;
// Размер данных end;
Данная функция возвращает комплексную
информацию о параметре, для получения данных о размере или типе можно
применять GetDataSize и GetDataType
function GetDataSize(const
ValueName: String): Integer;
Получить размер параметра ValueName
текущего ключа в байтах. Если - при ошибке. Для строкового параметра
размер учитывает в размере и один байт для #0, завершающего строку .
function GetDataType(const ValueName: String):
TRegDataType;
Получить тип текущего ключа.
procedure
GetKeyNames(Strings: TStrings);
Заполняет указанный Strings
списком под ключей текущего ключа. Применяется для построения программ
просмотра реестра или в том случае, когда количество подключей
неизвестно. Например, одна из моих программ создает в одном из ключей
несколько подключей с одинаковой структурой, но их количество заранее
неизвестно (настройки пользователей).
procedure
GetValueNames(Strings: TStrings);
Заполняет указанный Strings
списком параметров текущего ключа.
function HasSubKeys: Boolean;
Возвращает True, если текущий ключ имеет подключи и False в
противном случае
function KeyExists(const Key: String): Boolean;
Возвращает True, если ключ Key существует. Полезная функция,
рекомендуется применять ее перед открытием ключей.
function
LoadKey(const Key, FileName: String): Boolean;
Создает ключ Key
и загружает в него данные из файла с именем FileName. Полезно при
написании инсталляторов. Возвращает True при успешном выполнении.
procedure MoveKey(const OldName, NewName: String;
Delete: Boolean); Копировать или переименовать ключ. В любом
случае копирует все из ключа OldName в NewName (со всеми подключами).
После копирования анализируется Delete, и если он true, то ключ OldName
уничтожается со всем содержимым. Лично у меня не было потребности в
применении данной функции - она не требуется программ и предначначена
для построения редакторов реестра
function OpenKey(const Key:
String; CanCreate: Boolean): Boolean;
Очень важная функция - с
нее начинается работа с ключом. Key - имя открываемого ключа. Если ключ
с указанным именем не найден и CanCreate=true, то производится попытка
создать ключ с указанным именем. Возвращает признак успешности открытия
ключа, его обязательно следует анализировать.
function
OpenKeyReadOnly(const Key: String): Boolean;
Тоже, что и
OpenKey, но открытие идет в режиме "только чтение" Внимание !!!!!! Все
функции типа Read** при вызове генерируют исключение, если параметр не
найден. Это исключение следует отлавливать при помощи try except или
проверять наличие параметра при помощи ValueExists перед его чтением.
function ReadBinaryData(const Name: String; var Buffer; BufSize:
Integer): Integer;
Читает значение параметра с именем Name
текущего (открытого) ключа в Buffer размером BufSize.
function
ReadBool(const Name: String): Boolean;
Считать значение параметра
с именем Name типа Boolean function
ReadDate(const Name:
String): TDateTime;
Считать значение параметра с именем Name типа
дата
function ReadDateTime(const Name: String):
TDateTime;
Считать значение параметра с именем Name типа
дата-время
function ReadTime(const Name: String): TDateTime;
Считать значение параметра с именем Name типа время
function ReadFloat(const Name: String): Double;
Считать
значение параметра с именем Name типа Double
function
ReadInteger(const Name: String): Integer;
Считать значение
параметра с именем Name типа Integer
function ReadString(const
Name: String): String;
Считать значение параметра с именем Name
типа String
function RegistryConnect(const UNCName: String):
Boolean; Подключить сетевой реестр машины UNCName (формат: \сетевое имя
машины). Перед вызовом этой функции программа должна установить RootKey
в значение HKEY_USERS или HKEY_LOCAL_MACHINE. При успешном соединении и
открытии удаленного реестра его RootKey ставится в заданное перед
вызовам значение свойства RootKey и возвращается True.
procedure
RenameValue(const OldName, NewName: String);
Переименовать
параметр текущего ключа с именем OldName в NewName.
function
ReplaceKey(const Key, FileName, BackUpFileName: String):
Boolean;
Заменить место хранения ключа. Обычно ключи хранятся в
базовом файле реестра, нот вызовом данной функции можно задать в
качестве места хранения ключа отдельный файл с именем FileName (его
следует предварительно создать при помощи savekey). При каждой
перезагрузке компьютера ключ Key будет загружаться значениями,
считываемыми из файла этого файла FileName,т.е. по сути мы имеет дело с
ульем (hive) в терминологии Windows NT. Определение: Улей - часть
реестра (его ячейка). Улей является дискретным набором ключей, подключей
и параметров, который находится вверху иерархии реестра. Улей
поддерживается одиночным файлом. BackUpFileName - имя резервной копии,
которая создается перед перезаписью данных ключа Key. Если кого
интересуют подробности, то следует почитать книгу по реестру Windows NT,
главы типа "Ульи и файлы" и "Целостность и восстановление улья в
реестре". При разработке практических приложений я не разу не применял
этот вызов.
function RestoreKey(const Key, FileName: String):
Boolean;
Открывает указанный ключ и перезаписывает его данные и
подключи данными из файла FileName.
function SaveKey(const Key,
FileName: String): Boolean;
Сохраняет все параметры указанного
ключа и всех его подключей в файле FileName. Может применяться совместно
с LoadKey и RestoreKey для создания и восстановления ключей реестра.
function UnLoadKey(const Key: String): Boolean;
Удалить
улей Key из реестра.
function ValueExists(const Name: string):
Boolean;
Проверить, существует ли в текущем ключе параметр с
именем Name. Весьма полезная функция, т.к. чтение несуществующего
параметра приводит к исключительной ситуации
procedure
WriteBinaryData(const Name: String; var Buffer; BufSize: Integer);
Записать в параметр с именем Name данные из буфера Buffer
размером BufSize. Если параметр существовал, то он будет перезаписан.
Если параметр не существовал, то он будет создан. Это справедливо и для
всех последующих процедур записи параметров
Остальные процедуры
записи - WriteBool, WriteCurrency,WriteDate,WriteDateTime,
WriteExpandString, WriteFloat, WriteInteger, WriteString, WriteTime
имеют по два параметра - (имя ключа, значение ключа).
Ну вот,
класс описали, теперь приведем парочку примеров.
Пример -
запись.
var REG : TRegistry;
begin
REG :=
TRegistry.Create;
REG.RootKey:=HKEY_LOCAL_MACHINE; REG.OpenKey('SoftwareTest',true);
REG.WriteBool('Test1',true); REG.WriteInteger('Test2',12);
REG.CloseKey; REG.Destroy; end;
Данный пример
создает (если его не было) или открывает ключ реестра
HKEY_LOCAL_MACHINESoftwareTest и записывает в него два параметра типа
Boolean и Integer.
Источник: www.articles.org.ru
|