Использование реестра
Автор: Алексей Федоров
Реестр — это центральное хранилище информации о параметрах системы и установленных программах. В версиях Windows до Windows 95 программисты сохраняли параметры программ либо в INI-файлах WIN.INI и SYSTEM.INI, либо в дополнительных INI-файлах. Хотя использование INI-файлов поддерживается и в Win32, Microsoft настоятельно рекомендует для хранения необходимых в работе программы параметров пользоваться реестром. Реестр представляет собой иерархическую базу данных, cостоящую из секций, подсекций и элементов. Каждая секция имеет свое назначение. Хранить данные о пользовательских программах Microsoft рекомендует в секции HKEY_CURRENT_USER и подсекции Software. В этой подсекции вы создаете подсекцию, идентифицирующую вашу программу или фирму, и уже внутри нее располагаете данные.
Для упрощения работы с регистратором в состав Delphi (начиная с версии 2.0) входит модуль REGISTRY, содержащий реализацию трех классов, — TRegistry, TRegistryIniFile и TRegIniFile.
Внимание ! Чтобы использовать свойства и методы классов TRegistry, TRegistryIniFile и TRegIniFile, необходимо включить в список uses модуль Registry.
Собственно говоря, задача класса TRegIniFile — упростить перенос 16-битных программ в среду Windows 95. Методы этого класса эквивалентны методам класса TIniFile в 16-битной версии Delphi. Класс TRegIniFile позволяет обращаться к секции HKEY_CURRENT_USER, считывать и записывать строки (методы ReadString и WriteString), целочисленные значения (методы ReadInteger и WriteInteger), логические значения (методы ReadBool и WriteBool), секции (методы ReadSection, ReadSections и ReadSectionValues), удалять секции (метод EraseSection) и элементы (метод DeleteKey). Рассмотрим на примерах, как используются функции этого класса.
Microsoft рекомендует записывать данные, относящиеся к вашей программе, в подсекции секции HKEY_CURRENT_USER_Software. Предположим (не особенно фантазируя на эту тему), что ваша программа называется RegDemo, и данные для нее располагаются в секции Software\RegDemo. Ниже мы покажем, как поместить в регистратор строчные, целочисленные и логические данные, а затем считать их, — этих операций будет достаточно для того, чтобы сохранить в регистраторе параметры нашей программы, а затем считать их.
Прежде чем записать данные в определенную секцию, ее необходимо создать. Это происходит при вызове конструктора объекта TRegIniFile. В качестве параметра вы указываете название секции, и если таковой не существует, она создается:
После того как файл регистратора открыт (и создана определенная секция), мы можем записать данные. Поддерживаются три типа данных: целочисленные, логические и строчные данные. Для записи этих данных существуют методы WriteInteger, WriteBool и WriteString. В качестве параметров указываются:
- название подсекции;
- название элемента;
- записываемые данные.
Так, чтобы записать значение элемента MyIntVal в подсекции IntKey, следует выполнить код
а для того чтобы прочесть значение, необходимо вызвать метод ReadInteger (в качестве параметров указываются название подсекции, название элемента и значение по умолчанию):
Для чтения логических и строчных данных используются соответственно методы ReadBool и ReadStr, а для их записи – методы WriteBool и WriteString.
Расссмотрим пример использования перечисленных выше методов класса TRegIniFile. Расположим в форме компонент Memo, две группы GroupBox и шесть кнопок – три в группе Write и три в группе Read. Нажатие каждой кнопки в группе Write приведет к записи соответствующего значения в реестр, нажатие каждой кнопки в группе Read – к чтению этого значения.
Ниже приведен исходный текст модуля, в котором содержатся обработчики нажатия кнопок, использующие методы класса TRegIniFile.
На приведенном ниже рисунке показано, как выглядит созданная нами подсекция в редакторе REGEDIT.
Отметим, что рассмотренных выше функций вполне достаточно для того чтобы обеспечить минимальную функциональность приложения. Если же вам требуется читать и записывать данные из других секций реестра, вы можете воспользоваться методами класса TRegistry или (что мене удобно) непосредственно функциями Win32 API.
Прежде чем рассмотреть пример использования свойств и методов класса TRegistry, давайте кратко перечислим их.
В следующей таблице перечислены свойства класса TRegistry.
Позволяет узнать текущую подсекцию, в которой проводятся операции по чтению и записи. Для изменения подсекции следует использовать методы OpenKey и OpenKeyReadOnly
Позволяет узнать полное название текущей подсекции
Задает способ обновления информации в реестре – непосредственно или после вызова метода CloseKey.
Задает корневую секцию в реестре. По умолчанию установлено значение HKEY_CURRENT_USER
В следующей таблице перечислены методы класса TRegistry.
Записывает внесенные изменения и закрывает текущую подсекцию
Создает экземпляр класса TRegistry и задает значение корневой секции — HKEY_CURRENT_USER
Удаляет значение элемента
Уничтожает ранее созданный экземпляр класса TRegistry
Возвращает тип данных для указанного элемента
Возвращает размер данных для указанного элемента
Возвращает тип данных для указанного элемента
Возвращает информацию о текущем элементе
Возвращает имена подсекций для указанной секции
Возвращает названия элементов для указанной подсекции
Позволяет узнать, имеются ли подсекции для указанной секции
Позволяет узнать, существует ли элемент
Создает новую подсекцию и загружает в нее информацию из указанного файла
Перемещает указанную подсекцию и все вложенные подсекции в заданное место
Открывает подсекцию только для чтения
Считывает данные в бинарном формате
Считывает данные в булевом формате
Считывает данные в формате валюты
Считывает данные в формате даты
Считывает данные в формате “дата/время”
Считывает данные в формате с плавающей точкой
Считывает данные в целочисленном формате
Считывает данные в строчном формате
Считывает данные в формате времени
Устанавливает соединение с реестром на другом компьютере
Замещает значение элемента значениями из файла
Восстанавливает значение элемента из файла
Сохраняет значение элемента в файле
Удаляет подсекцию, загруженную методом LoadKey
Позволяет узнать, существует ли значение у элемента
Записывает данные в бинарном формате
Записывает данные в булевом формате
Записывает данные в формате валюты
Записывает данные в формате даты
Записывает данные в формате “дата/время”
Записывает данные в формате «расширенно» строки
Записывает данные в формате с плавающей точкой
Записывает данные в целочисленном формате
Записывает данные в строчном формате
Записывает данные в формате времени
После того как мы кратко познакомились со свойствами и методами класса TRegistry, давайте рассмотрим несколько примеров их использования.
Перед использованием свойств и методов класса TRegistry, необходимо создать экземпляр этого класса. Например:
Задание корневой секции
Если вы собираетесь работать с секцией, отличной от HKEY_CURRENT_USER (это значение задается по умолчанию), то после инициализации вы должны изменить значение свойства RootKey. Возможны следующие значения:
Основы работы с реестром Delphi
Ранее я повествовал о том, как работать с ini файлами. Сегодня мы пойдем дальше и научимся работать с реестром Windows.
Что такое реестр в Windows?
Если не вдаваться в подробности, а дать доступное определение, то:
Реестр в современных версиях Windows можно назвать базой данных операционной системы. База предназначена, чтобы хранить настройки Windows и приложений.
Если, Вы раньше не сталкивались с таким понятием, то настоятельно рекомендую почитать какую-нибудь литературу. Я же сейчас буквально в двух словах расскажу тот минимум, который понадобится, чтобы работать с реестром средствами Delphi.
Назначение разделов реестра.
Все данные, хранящиеся в реестре, разбиты на четыре группы:
- HKEY_CLASSES_ROOT (в сокращении HKCR) — в этом разделе хранятся ассоциации между приложениями и расширениями файлов. Проще говоря – какие файлы открывать той или иной программой.
- HKEY_CURRENT_USER – содержит данные о пользователе. В этой ветке можно посмотреть адрес рабочего стола и других пользовательских директорий.
- HKEY_LOCAL_MACHINE — в данном разделе реестра хранятся информация о глобальных аппаратных и программных настройках системы.
- HKEY_USERS – содержит индивидуальные настройки каждого пользователя.
- HKEY_CURRENT_CONFIG – данные о конфигурации компьютера.
В каждом разделе реестра хранятся ключи, каждый из которых, может иметь подключи.
Каждый ключ реестра обладает следующими параметрами:
- Имя параметра
- Тип параметра
- Значение
Итак, основные понятия, связанные с реестром Windows, мы просмотрели. Пора приступать непосредственно к программированию.
Работа с Реестров в Delphi
Для работы с реестром мы будем использовать уже готовый объект TRegIniFile. Чтобы этот объект стал нам доступен, необходимо в разделе uses подключить модуль Registry.
Итак, я считаю, что нагляднее всего будет написать небольшое приложение. Программа будет сохранять или считывать введенное нами значение в реестр. Набросаем форму.
В первое поле будем вводить переменную, которую хотим сохранить. Во второе окно будем выводить значение, считанное из реестра. Делать это будем по нажатию соответствующих кнопок.
Разберем, что происходит по нажатию кнопки BSave:
Вначале мы определяем переменную типа TRegIniFile. Затем инициализируем её, для этого вызываем метод Create. По умолчанию нам откроется ветвь HKEY_CURRENT_USER. А параметр конструктора (‘software’) говорит нам о том, что мы сразу перейдем в одноименный раздел ветви. Если в конструктор не передавать никакого значения, то ничего страшного не произойдет. Просто после инициализации мы окажемся в корне основной ветви. Если Вам нужна другая ветвь реестра, то после инициализации переменной присвойте параметру RootKey соответствующее значение.
После инициализации мы должны добраться до интересующего нас подраздела – метод OpenKey. Метод имеет два параметра: имя подраздела и признак того нужно ли создавать раздел, если его не существует. Процедуру OpenKey можно вызывать столько раз, сколько нужно, пока не доберетесь до нужной подсекции.
Теперь мы можем перейти непосредственно к записи. WriteString– вот что нам поможет. Передадим в него три параметра:
- Название подсекции
- Название параметра
- Значение
Обратите внимание, что метод называется WriteString – он служит для записи строк, если нужно записать число используйте WriteInteger, ну и так далее по аналогии.
После того, как значение сохранено, можем удалять переменную.
По нажатию кнопки BLoadпроисходит следующее:
Все очень похоже, за исключением метода FReestr.ReadString. Этот метод считывает из ключа ‘value1’, параметр ‘test’, если такого параметра нет или, его не удалось считать, то присваивается значение ‘Не прочитал’.
Основы работы с реестром в DelphiВам теперь известны, если нужно что-то дополнительно объяснить – задавайте свои вопросы в комментариях ниже.