Для начала, немного теории о реестре Windows.

История появления реестра
Давным-давно все настройки программ хранились в Ini-файлах, которые представляли из себя обычные текстовые файлы с структурированной записью всех параметров программ. Со временем программы стали расти, как и количество их параметров, и в следствии чего INI-файлы превратились в настоящую свалку, в которой что-либо разобрать было очень сложно.
Поэтому в Microsoft решили создать одну единую базу данных, где хранились бы все настройки и параметры Windows — так появился реестр.

Что из себя теперь представляет реестр Windows
Итак, сегодняшний реестр — это структурированая база данных, в которой хранятся настройки операционной системы, установленных программ, профилей пользователей, сведения о типах файлов и много чего еще. Теперь, обычный двоичный файл размером в 64 кб(Win 3.1) стал одним из основных компонентов Windows, от которого отказаться будет очень сложно…
Реестр состоит из 5 основных разделов, которые включают в себя огромное множество под-разделов, на описание которых уйдет не одно сотня страниц. Поэтому опишу только главные разделы:

HKEY_CLASSES_ROOT — в этом разделе хранится информация о зарегистрированных типах файлов, а также об обьектах COM и ActiveX.

HKEY_CURRENT_USER — в этом разделе хранится информация о пользователе, вошедшем в данный момент в систему: папки пользователя, параметры панели управления и другие настройки.

HKEY_LOCAL_MACHINE — в этом разделе содержится информация о параметрах конфигурации всех пользователей.

HKEY_USERS — в этом разделе находится информация о всех загруженных профилях пользователей данного комьютера.

HKEY_CURRENT_CONFIG — в этом разделе содержится информация о профиле обурудования, которую локальный компьютер использует при запуске системы.

Минусы реестра

Реестр подвержен фрагментации, поэтому чем больше в нем записей, тем медленнее он работает. Поэтому засорять его своими настройками не хорошо, если эти настройки не будут впоследствии удалены.
В реестре хранится системная информация от которой записит работа всего компьютера, и если что-то нечаянно испортить, то вам будет плохо.

А теперь практика

Для того чтобы работать с реестром нужно подключить файл «Registry.hpp«

Теперь нам доступен класс TRegistry. Для начала работы необходимо создать объект класса, после чего указать раздел с которым мы будем работать:

Запись параметров в реестр

Для записи параметров в реестр у класса TRegistry существует множество функций, которые очень похожи и различаются только в типе записываемой информации. Для обычных строк это WriteStringName«,»Value«), для записи целых чисел это WriteIntegerName«,int) и так далее… Список наиболее часто-используемых функций будет приведен ниже.
Прежде чем записать какой-то параметр в определенную ветку реестра, ее нужно открыть Для этого используется функция OpenKeyKey«,CanCreate). Первым параметром функции идет имя ключа, открываемого для записи, а вторым параметром идет значение типа bool — при включении этого значения, в случае отсутствия открываемого ключа, он будет создан автоматически. В противном случае, запись в несуществующий ключ не произойдет (что и вполне логично).
Доступ к подключам происходит точно так же как и к самим ключам: допустим, у нас есть ветка реестра «TestProgramm\\Options\\ID«.
Для того, чтобы записать какой-то параметр в ключ «TestProgramm» нужно написать так:

Если же нужно записать что-то в подветку этого ключа, то следует написать вот так:

И так далее….

Теперь пример записи обычной строки в реестр:

Список наиболее часто-используемых функций для записи ключей в реестр:

Во всех выше-описанных функциях поле «Name«, если оно не существует, будет созданно автоматически.

Чтение параметров из реестра

Чтение параметров из реестра происходит точно также, как и запись, только в этом случае каждая функция возвращает значение определенного типа. К примеру, чтобы прочитать параметр, содержащий обычную строку, сделать это стоит следующим образом:

Список основных функций для считывания опять будет приведен в конце.

Теперь простой пример считывания параметра из реестра:

Список основных функций для чтения параметров из реестра

Удаление ключей и разделов

Мусорить не хорошо, потому нужно после себя убирать (удалять параметры из реестра, естественно, нужно тогда, когда программа больше не будет к ним обращаться, на пример, при деинсталяции(удалении с компьютера) программы. Для этого существует две функции:

DeleteValue() — удаление параметра:

DeleteKey() — удаление всего ключа:

Переименовывание параметров

Для того, чтобы переименовать параметр нужно чтобы этот параметр существовал и чтобы параметра, который бы соответствовал новому имени не существовало:

Как узнать, имеется-ли в определенном ключе какой-то параметр?

Для этого существует функция ValueExists(«Name»), которая вовращает 1, если параметр существует и 0, если параметра не существует:

Как скопировать, переместить ключ?

Для этого можно воспользоваться функцией MoveKey(String OldName, String NewName, bool Delete) — копируем ключ «OldName» в «NewName«, если Delete=true, то автоматически удаляется ключ OldName:

Сохранение и загрузка ключей в файл

Для сохранения и загрузки ключей в TRegistry существует 2 функции: SaveKeyKey«,»FileName«) и LoadKeyKey«,»FileName«). Первым параметром в этих функциях идет имя ключа, над которым будет происходить загрузка/сохранения, а вторым — имя файла в который будет сохранен или загружен ключ реестра.

Как получить список всех параметров заданного ключа?

Для этого предназначена функция GetValueNames(TStringList *List), которая передает все параметры ключа в заданный список List.

Как получить список всех подключей заданного ключа?

Для этого предназначена функция GetKeyNames(TStringList *List), которая передает все параметры ключа в заданный список List.

Класс TRegistry имеет перегруженный конструктор, задекларированный как:

Как мы видим, при создании объекта класса TRegistry, можно управлять атрибутом безопасности.

Параметр AAccess может принимать следующие значения:

  • KEY_CREATE_LINK — Permission to create a symbolic link.
  • KEY_CREATE_SUB_KEY — Permission to create subkeys.
  • KEY_ENUMERATE_SUB_KEYS — Permission to enumerate subkeys.
  • KEY_EXECUTE — Permission for read access.
  • KEY_NOTIFY — Permission for change notification.
  • KEY_QUERY_VALUE — Permission to query subkey data.
  • KEY_READ — Combination of KEY_QUERY_VALUEKEY_ENUMERATE_SUB_KEYS, and KEY_NOTIFY access.
  • KEY_SET_VALUE Permission to set subkey data.
  • KEY_WRITE Combination of KEY_SET_VALUE and KEY_CREATE_SUB_KEY access.
  • KEY_ALL_ACCESS — Combination of KEY_QUERY_VALUEKEY_ENUMERATE_SUB_KEYSKEY_NOTIFYKEY_CREATE_SUB_KEYKEY_CREATE_LINK, and KEY_SET_VALUE access.

Соответственно, могут возникнуть моменты, когда доступ к определённым действиям в реестре ограничить. В таком случае, программа может прервать выполнение нужного действия.
Для того, чтобы избежать подобных проблем, необходимо выполнять проверку на успешность создания объекта.

Вариант 1 (упрощённый):

Вариант 2 (заключается в использовании блоков try … catch):

Соответственно, можно использовать и блоки с __finally.

После завершении использования не забываем очищать память:

пример:

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *