Где в реестре находятся настройки delphi. Использование средней кнопки мыши Logitech в качестве двойного щелчка. Объединение ОС Android и Chrome

Что такое реестр в Windows?

Если не вдаваться в подробности, а дать доступное определение, то:

Реестр в современных версиях Windows можно назвать базой данных операционной системы. База предназначена, чтобы хранить настройки Windows и приложений.

Если, Вы раньше не сталкивались с таким понятием, то настоятельно рекомендую почитать какую-нибудь литературу. Я же сейчас буквально в двух словах расскажу тот минимум, который понадобится, чтобы работать с реестром средствами Delphi .

Назначение разделов реестра.

Все данные, хранящиеся в реестре, разбиты на четыре группы:

  • HKEY_CLASSES_ROOT (в сокращении HKCR) - в этом разделе хранятся ассоциации между приложениями и расширениями файлов. Проще говоря – какие файлы открывать той или иной программой.
  • HKEY_CURRENT_USER – содержит данные о пользователе. В этой ветке можно посмотреть адрес рабочего стола и других пользовательских директорий.
  • HKEY_LOCAL_MACHINE - в данном разделе реестра хранятся информация о глобальных аппаратных и программных настройках системы.
  • HKEY_USERS – содержит индивидуальные настройки каждого пользователя.
  • HKEY_CURRENT_CONFIG – данные о конфигурации компьютера.

В каждом разделе реестра хранятся ключи, каждый из которых, может иметь подключи.

Каждый ключ реестра обладает следующими параметрами:

  1. Имя параметра
  2. Тип параметра
  3. Значение

Итак, основные понятия, связанные с реестром Windows, мы просмотрели. Пора приступать непосредственно к программированию.

Работа с Реестров в Delphi

Для работы с реестром мы будем использовать уже готовый объект TRegIniFile. Чтобы этот объект стал нам доступен, необходимо в разделе uses подключить модуль Registry.

Итак, я считаю, что нагляднее всего будет написать небольшое приложение. Программа будет сохранять или считывать введенное нами значение в реестр. Набросаем форму.

В первое поле будем вводить переменную, которую хотим сохранить. Во второе окно будем выводить значение, считанное из реестра. Делать это будем по нажатию соответствующих кнопок.

Разберем, что происходит по нажатию кнопки BSave:

procedure TForm1. BSave Click(Sender: TObject); var FReestr: TRegIniFile; // Определяем переменную begin FReestr:=TRegIniFile.Create("software"); // Инициализируем FReestr.OpenKey("MyProg",true); // Открываем нужный ключ FReestr.WriteString("value1","test",ESave.Text); // Заносим значение FreeAndNil(FReestr); // Уничтожаем переменную end;

Вначале мы определяем переменную типа TRegIniFile. Затем инициализируем её, для этого вызываем метод Create. По умолчанию нам откроется ветвь HKEY_CURRENT_USER. А параметр конструктора ("software") говорит нам о том, что мы сразу перейдем в одноименный раздел ветви. Если в конструктор не передавать никакого значения, то ничего страшного не произойдет. Просто после инициализации мы окажемся в корне основной ветви. Если Вам нужна другая ветвь реестра, то после инициализации переменной присвойте параметру RootKey соответствующее значение.

Например:

FReestr.RootKey:= HKEY_CLASSES_ROOT;

После инициализации мы должны добраться до интересующего нас подраздела – метод OpenKey . Метод имеет два параметра: имя подраздела и признак того нужно ли создавать раздел, если его не существует. Процедуру OpenKey можно вызывать столько раз, сколько нужно, пока не доберетесь до нужной подсекции.

Теперь мы можем перейти непосредственно к записи . WriteString – вот что нам поможет. Передадим в него три параметра:

  1. Название подсекции
  2. Название параметра
  3. Значение

Обратите внимание, что метод называется WriteString – он служит для записи строк , если нужно записать число используйте WriteInteger, ну и так далее по аналогии.

После того, как значение сохранено, можем удалять переменную.

FreeAndNil(FReestr);

По нажатию кнопки BLoadпроисходит следующее:

procedure TForm1.BLoadClick(Sender: TObject); var FReestr: TRegIniFile; begin FReestr:=TRegIniFile.Create("software"); FReestr.OpenKey("MyProg",true); ELoad.Text:=FReestr.ReadString("value1","test","Не прочитал"); FreeAndNil(FReestr); end;

Все очень похоже, за исключением метода FReestr.ReadString. Этот метод считывает из ключа "value1", параметр "test", если такого параметра нет или, его не удалось считать, то присваивается значение "Не прочитал".

Основы работы с реестром в DelphiВам теперь известны, если нужно что-то дополнительно объяснить – задавайте свои вопросы в комментариях ниже.

1. Создать новый документ, поместить его в папку Windows/ShellNew

2. В редакторе реестра найти расширение этого файла, добавить новый подключ, добавить туда строку: FileName в качестве значения которой указать имя созданного файла.

Путь к файлу который открывает не зарегистрированные файлы

1. Найти ключ HKEY_CLASSES_ROOT\Unknown\Shell

2. Добавить новый ключ Open

3. Под этим ключом еще ключ с именем command в котором изменить значение (По умолчанию) на имя запускаемого файла, к имени нужно добавить %1. (Windows заменит этот символ на имя запускаемого файла)

В проводнике контекстное меню "Открыть в новом окне"

1. Найти ключ HKEY_CLASSES_ROOT\Directory\Shell

2. Создать подключ: opennew в котором изменить значение (По умолчанию) на: "Открыть в новом окне"

3. Под этим ключом создать еще подключ command (По умолчанию) = explorer %1

Использование средней кнопки мыши Logitech в качестве двойного щелчка

Подключ HKEY_LOCAL_MACHINE\SoftWare\Logitech и там найти параметр DoubleClick заменить 000 на 001

Новые звуковые события

Например создает звуки на запуск и закрытие WinWord

HKEY_CURRENT_USER\AppEvents\Shemes\Apps добавить подключ WinWord и к нему подключи Open и Close.

Теперь в настройках звуков видны новые события

Путь в реестре для деинсталяции программ:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

Работа с реестром в Delphi 1

В Delphi 2 и выше появился объект TRegistry при помощи которого очень просто работать с реестром. Но мы здесь рассмотрим функции API, которые доступны и в Delphi 1.

Реестр предназначен для хранения системных переменных и позволяет зарегистрировать файлы программы, что обеспечивает их показ в проводнике с соответствующей иконкой, вызов программы при щелчке на этом файле, добавление ряда команд в меню, вызываемое при нажатии правой кнопки мыши над файлом. Кроме того, в реестр можно внести некую свою информацию (переменные, константы, данные о инсталлированной программы...). Программу можно добавить в список деинсталляции, что позволит удалить ее из менеджера "Установка/Удаление программ" панели управления.

Для работы с реестром применяется ряд функций 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, если нет ошибок.

RegEnumKey(Key: HKey; index: Longint; Buffer: PChar;cb: Longint): Longint;

Получить имена всех подразделов раздела Key, где Key - Handle на открытый или созданный раздел (см. RegCreateKey и RegOpenKey), Buffer - указатель на буфер, cb - размер буфера, index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой (см. пример).

RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint;

Возвращает текстовую строку, связанную с ключом Key\SubKey.Value - буфер для строки; cb- размер, на входе - размер буфера, на выходе - длина возвращаемой строки. Возврат - код ошибки.

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, если нет ошибок.

{ Создаем список всех подразделов указанного раздела } procedure TForm1.Button1Click(Sender: TObject); var MyKey: HKey; { Handle для работы с разделом } Buffer: array of char; { Буфер } Err, { Код ошибки } index: longint; { Индекс подраздела } begin Err:=RegOpenKey(HKEY_CLASSES_ROOT,"DelphiUnit",MyKey); { Открыли раздел } if Err<> ERROR_SUCCESS then begin MessageDlg("Нет такого раздела!!",mtError,,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;

Объект INIFILES - работа с INI файлами.

Почему иногда лучше использовать INI-файлы, а не реестр?

  • 1. INI-файлы можно просмотреть и отредактировать в обычном блокноте.
  • 2. Если INI-файл хранить в папке с программой, то при переносе папки на другой компьютер настройки сохраняются. (Я еще не написал ни одной программы, которая бы не поместилась на одну дискету:)
  • 3. Новичку в реестре можно запросто запутаться или (боже упаси), чего-нибудь не то изменить.

Поэтому для хранения параметров настройки программы удобно использовать стандартные INI файлы Windows. Работа с INI файлами ведется при помощи объекта TIniFiles модуля IniFiles. Краткое описание методов объекта TIniFiles дано ниже.

Constructor Create("d:\test.INI");

Создать экземпляр объекта и связать его с файлом. Если такого файла нет, то он создается, но только тогда, когда произведете в него запись информации.

WriteBool(const Section, Ident: string; Value: Boolean);

Присвоить элементу с именем Ident раздела Section значение типа boolean

WriteInteger(const Section, Ident: string; Value: Longint);

Присвоить элементу с именем Ident раздела Section значение типа Longint

WriteString(const Section, Ident, Value: string);

Присвоить элементу с именем Ident раздела Section значение типа String

ReadSection (const Section: string; Strings: TStrings);

ReadSectionValues(const Section: string; Strings: TStrings);

EraseSection(const Section: string);

Удалить раздел Section со всем содержимым

ReadBool(const Section, Ident: string; Default: Boolean): Boolean;

ReadInteger(const Section, Ident: string; Default: Longint): Longint;

ReadString(const Section, Ident, Default: string): string;

Закрыть и освободить ресурс. Необходимо вызвать при завершении работы с INI файлом

Property Values: string;

Доступ к существующему параметру по имени Name

Procedure TForm1.FormClose(Sender: TObject); var IniFile:TIniFile; begin IniFile:= TIniFile.Create("d:\test.INI"); { Создали экземпляр объекта } IniFile.WriteBool("Options", "Sound", True); { Секция Options: Sound:=true } IniFile.WriteInteger("Options", "Level", 3); { Секция Options: Level:=3 } IniFile.WriteString("Options" , "Secret password", Pass); { Секция Options: в Secret password записать значение переменной Pass } IniFile.ReadSection("Options ", memo1.lines); { Читаем имена переменных} IniFile.ReadSectionValues("Options ", memo2.lines); { Читаем имена и значения } IniFile.Free; { Закрыли файл, уничтожили объект и освободили память } end;

1. Создать новый документ, поместить его в папку Windows/ShellNew

2. В редакторе реестра найти расширение этого файла, добавить новый подключ, добавить туда строку: FileName в качестве значения которой указать имя созданного файла.

Путь к файлу который открывает не зарегистрированные файлы

1. Найти ключ HKEY_CLASSES_ROOT\Unknown\Shell

2. Добавить новый ключ Open

3. Под этим ключом еще ключ с именем command в котором изменить значение (По умолчанию) на имя запускаемого файла, к имени нужно добавить %1. (Windows заменит этот символ на имя запускаемого файла)

В проводнике контекстное меню "Открыть в новом окне"

1. Найти ключ HKEY_CLASSES_ROOT\Directory\Shell

2. Создать подключ: opennew в котором изменить значение (По умолчанию) на: "Открыть в новом окне"

3. Под этим ключом создать еще подключ command (По умолчанию) = explorer %1

Использование средней кнопки мыши Logitech в качестве двойного щелчка

Подключ HKEY_LOCAL_MACHINE\SoftWare\Logitech и там найти параметр DoubleClick заменить 000 на 001

Новые звуковые события

Например создает звуки на запуск и закрытие WinWord

HKEY_CURRENT_USER\AppEvents\Shemes\Apps добавить подключ WinWord и к нему подключи Open и Close.

Теперь в настройках звуков видны новые события

Путь в реестре для деинсталяции программ:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

Работа с реестром в Delphi 1

В Delphi 2 и выше появился объект TRegistry при помощи которого очень просто работать с реестром. Но мы здесь рассмотрим функции API, которые доступны и в Delphi 1.

Реестр предназначен для хранения системных переменных и позволяет зарегистрировать файлы программы, что обеспечивает их показ в проводнике с соответствующей иконкой, вызов программы при щелчке на этом файле, добавление ряда команд в меню, вызываемое при нажатии правой кнопки мыши над файлом. Кроме того, в реестр можно внести некую свою информацию (переменные, константы, данные о инсталлированной программы...). Программу можно добавить в список деинсталляции, что позволит удалить ее из менеджера "Установка/Удаление программ" панели управления.

Для работы с реестром применяется ряд функций 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, если нет ошибок.

RegEnumKey(Key: HKey; index: Longint; Buffer: PChar;cb: Longint): Longint;

Получить имена всех подразделов раздела Key, где Key - Handle на открытый или созданный раздел (см. RegCreateKey и RegOpenKey), Buffer - указатель на буфер, cb - размер буфера, index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой (см. пример).

RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint;

Возвращает текстовую строку, связанную с ключом Key\SubKey.Value - буфер для строки; cb- размер, на входе - размер буфера, на выходе - длина возвращаемой строки. Возврат - код ошибки.

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, если нет ошибок.

{ Создаем список всех подразделов указанного раздела } procedure TForm1.Button1Click(Sender: TObject); var MyKey: HKey; { Handle для работы с разделом } Buffer: array of char; { Буфер } Err, { Код ошибки } index: longint; { Индекс подраздела } begin Err:=RegOpenKey(HKEY_CLASSES_ROOT,"DelphiUnit",MyKey); { Открыли раздел } if Err<> ERROR_SUCCESS then begin MessageDlg("Нет такого раздела!!",mtError,,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;

Объект INIFILES - работа с INI файлами.

Почему иногда лучше использовать INI-файлы, а не реестр?

  • 1. INI-файлы можно просмотреть и отредактировать в обычном блокноте.
  • 2. Если INI-файл хранить в папке с программой, то при переносе папки на другой компьютер настройки сохраняются. (Я еще не написал ни одной программы, которая бы не поместилась на одну дискету:)
  • 3. Новичку в реестре можно запросто запутаться или (боже упаси), чего-нибудь не то изменить.

Поэтому для хранения параметров настройки программы удобно использовать стандартные INI файлы Windows. Работа с INI файлами ведется при помощи объекта TIniFiles модуля IniFiles. Краткое описание методов объекта TIniFiles дано ниже.

Constructor Create("d:\test.INI");

Создать экземпляр объекта и связать его с файлом. Если такого файла нет, то он создается, но только тогда, когда произведете в него запись информации.

WriteBool(const Section, Ident: string; Value: Boolean);

Присвоить элементу с именем Ident раздела Section значение типа boolean

WriteInteger(const Section, Ident: string; Value: Longint);

Присвоить элементу с именем Ident раздела Section значение типа Longint

WriteString(const Section, Ident, Value: string);

Присвоить элементу с именем Ident раздела Section значение типа String

ReadSection (const Section: string; Strings: TStrings);

ReadSectionValues(const Section: string; Strings: TStrings);

EraseSection(const Section: string);

Удалить раздел Section со всем содержимым

ReadBool(const Section, Ident: string; Default: Boolean): Boolean;

ReadInteger(const Section, Ident: string; Default: Longint): Longint;

ReadString(const Section, Ident, Default: string): string;

Закрыть и освободить ресурс. Необходимо вызвать при завершении работы с INI файлом

Property Values: string;

Доступ к существующему параметру по имени Name

Procedure TForm1.FormClose(Sender: TObject); var IniFile:TIniFile; begin IniFile:= TIniFile.Create("d:\test.INI"); { Создали экземпляр объекта } IniFile.WriteBool("Options", "Sound", True); { Секция Options: Sound:=true } IniFile.WriteInteger("Options", "Level", 3); { Секция Options: Level:=3 } IniFile.WriteString("Options" , "Secret password", Pass); { Секция Options: в Secret password записать значение переменной Pass } IniFile.ReadSection("Options ", memo1.lines); { Читаем имена переменных} IniFile.ReadSectionValues("Options ", memo2.lines); { Читаем имена и значения } IniFile.Free; { Закрыли файл, уничтожили объект и освободили память } end;

Реестр - это системная база данных. Получить доступ к ней можно написав в командной строке ("ПУСК > "Выполнить") слово "RegEdit" - при этом запуститься программа для редактирования реестра. Окно этой программы поделено на две части. В левой (более узкой панели) показана древовидная структура ключей. Ключ - это раздел, отвечающий за какие-либо установки. Сами установки называются параметрами, находящимися в правой панели. Каждый параметр имеет своё имя, значение и тип. Параметры бывают строкового типа, двоичного и типа DWORD. Их очень много, но их назначение зависит от того, в каком ключе находится той или иной параметр. Ключи делятся между шестью основными разделами:

  • HKEY_CLASSES_ROOT - Содержит информацию об OLE, операциях перетаскивания (drag-and-drop - с англ. перетащить-и-отпустить) и ярлыках. В данном разделе можно так же указать программы, запускаемые при активизации файлов определённого типа. Данный раздел является псевдонимом для ветви HKEY_LOCAL_MACHINE\Software\Classes
  • HKEY_CURRENT_USER - Содержит индивидуальные установки для каждого пользователя, зарегистрированного в системе. Данный раздел является псевдонимом для ветви HKEY_USERS
  • HKEY_LOCAL_MACHINE - Содержит аппаратные и программные установки, необходимые для функционирования оборудования и программ. Данный раздел так же хранит конфигурацию Windows.
  • HKEY_USERS - Содержит установки пользователей и соответствующие конфигурационные данные, такие как цвет окна, расположение элементов на рабочем столе, обои, заставки.
  • HKEY_CURRENT_CONFIG - Содержит информацию о текущем аппаратном профиле. Если вы не используете аппаратные профили, данный раздел содержит установки Windows по умолчанию.
  • HKEY_DYN_DATA - В отличие от других разделов, которые хранят статистические данные (неизменяющиеся во время сеанса), данный раздел содержит указатели на динамические данные (постоянно изменяющиеся во время работы компьютера). Windows использует данный раздел для отслеживания профилей оборудования plug-and-play, статистики по производительности и драйверов виртуальных устройств VxD.

Все данные системного реестра заключаются в двух файлах, находящихся в директории Windows - это System.dat и User.dat.

Структура reg-файлов

Знание реестра Windows будет не полным без умения написать reg-файл. Начнем с того, что это такое. Reg-файл - это файл, имеющий определенную структуру и содержащий информацию, которая может быть импортирована в реестр. Если была заблокирована работа с редактором реестра, то наиболее легким способом подредактировать реестр будет создание и импортирование reg-файла (конечно, можно выйти в DOS, в защищенный режим, воспользоваться другими программами, но это все гораздо сложнее, а главное дольше).

К reg-файлам предъявляются определенные требования по структуре. Начнем с того, что в первой строке файла обязательно должно быть введено REGEDIT4. Обратите внимание на то, что буквы должны быть большие. Кроме этого в первой строке ничего быть не должно. После этого текста ОБЯЗАТЕЛЬНО должна быть пустая строка. Затем, указывается раздел реестра, в котором надо прописать или изменить какие-то параметры. Название раздела должно быть заключено в квадратные скобки [...]. Ниже прописываются параметры, которые надо добавить, по одному параметру в строке. Если вам надо провести изменения в нескольких разделах, то вы должны оставлять одну пустую строку между последним параметром предыдущего раздела и названием следующего раздела. Может немного запутанно, но вот как это должно выглядеть:

REGEDIT4 "param1"="znachenie1" "param2"="znachenei2" "param3"="znachenie3" "param_1"="znachenie_1"

Последняя строка в файле должна быть ПУСТОЙ. После того, как вы создали такой файл, просто запустите его как обычную программу, вам будет выдан запрос о необходимости провести изменения в реестре, и после положительного ответа информация из файла будет импортирована. О результатах импортирования Windows сообщит в появившемся после этого окне.

Теперь пару слов о параметрах, которые можно добавлять. Как вы, наверное, обратили внимание, в приведенном выше примере добавляются параметры с помощью строк типа "param1"="znachenie1". Т.е. таким образом добавляется СТРОКОВЫЙ параметр с именем "param1" и значением "znachenie1". Но ведь существуют еще и параметры двоичные и DWORD. Формат записи для их добавления несколько другой. Для параметров типа DWORD используется строка:

"param"=dword:XXXXXXXX

Здесь "param" - имя параметра, dword - указывает на тип этого параметра (буквы должны быть обязательно маленькие!) и после двоеточия следует значение из восьми цифр в шестнадцатеричном (!) формате. Однако большинство параметров DWORD имеют значение либо 0, либо 1, значит, вы должны написать соответственно либо 00000000, либо 00000001 вместо значков ХХХХХХХХ. Пробелы в строке не допускаются.

Для добавления двоичного параметра формат записи несколько иной:

"param"=hex:XX,XX,XX,....

Теперь расшифруем эту строку. С названием параметра все понятно, после знака "=" идет hex, т.е. указывается, что это будет двоичный параметр, затем идут шестнадцатеричные числа, отделенные запятой. Например, если вам надо добавить двоичный параметр равный "be 00 00 00", то вы пишете строку:

"param"=hex:be,00,00,00

В реестре существуют параметры "По умолчанию" ("Default"). Чтобы присвоить им какое-то значение через reg-файл, надо добавить такую строку:

@="znachenie"

Здесь значок "@" показывает, что у нас присваивается значение параметра "По умолчанию". Обратите внимание на то, что он не заключается в кавычки.

Ниже приведен пример простенького reg-файла, который прописывает в реестр сайт, устанавливающий домашнюю страничку в Internet Explorer"e:

REGEDIT4 "Start Page" = http://www.virun.com.ua

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

[-HKEY_LOCAL_MACHINE\Software\QuickSoft\QuickStart]

Благодаря этой записи, подраздел "QuickStart" из раздела "QuickSoft" будет удален со всем содержимым. Однако, как быть с параметрами? Ведь их удалять нельзя. Установка ограничений на доступ к различным настройкам оболочки Windows производится с помощью параметров типа DWORD. При этом, если значение параметра равно 1 (00000001), то ограничение включено, а если равно 0 (00000000), то ограничение отключено. Таким образом, параметры удалять вовсе не обязательно, достаточно просто присвоить им значения равные нулю.

Использование реестра

Как нам уже известно, реестр представляет собой иерархическую базу данных, cостоящую из секций, подсекций и элементов. Каждая секция имеет свое назначение. Хранить данные о пользовательских программах Microsoft рекомендует в секции HKEY_CURRENT_USER и подсекции Software. В этой подсекции вы создаете подсекцию, идентифицирующую вашу программу или фирму, и уже внутри нее располагаете данные.
Модуль Registry

Для упрощения работы с регистратором в состав Delphi (начиная с версии 2.0) входит модуль REGISTRY, содержащий реализацию трех классов, - TRegistry, TRegistryIniFile и TRegIniFile.
Внимание! Чтобы использовать свойства и методы классов TRegistry, TRegistryIniFile и TRegIniFile, необходимо включить в список uses модуль Registry.

TRegIniFile

Собственно говоря, задача класса 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. В качестве параметра вы указываете название секции, и если таковой не существует, она создается:

RegFile:= TRegIniFile.Create(SubKey);

После того как файл регистратора открыт (и создана определенная секция), мы можем записать данные. Поддерживаются три типа данных: целочисленные, логические и строчные данные. Для записи этих данных существуют методы WriteInteger , WriteBool и WriteString . В качестве параметров указываются:

  • название подсекции;
  • название элемента;
  • записываемые данные.

Так, чтобы записать значение элемента MyIntVal в подсекции IntKey, следует выполнить код:

RegFile.WriteInteger(IntKey, "Int_Val", 32000);

а для того чтобы прочесть значение, необходимо вызвать метод ReadInteger (в качестве параметров указываются название подсекции, название элемента и значение по умолчанию):

RegFile.ReadInteger(IntKey, "Int_Val", 0));

Для чтения логических и строчных данных используются соответственно методы ReadBool и ReadStr , а для их записи – методы WriteBool и WriteString .

Расссмотрим пример использования перечисленных выше методов класса TRegIniFile. Расположим в форме компонент Memo, две группы GroupBox и шесть кнопок – три в группе Write и три в группе Read. Нажатие каждой кнопки в группе Write приведет к записи соответствующего значения в реестр, нажатие каждой кнопки в группе Read – к чтению этого значения.

Скачать исходный текст модуля, в котором содержатся обработчики нажатия кнопок, использующие методы класса TRegIniFile можно

Отметим, что рассмотренных выше функций вполне достаточно для того чтобы обеспечить минимальную функциональность приложения. Если же вам требуется читать и записывать данные из других секций реестра, вы можете воспользоваться методами класса TRegistry или непосредственно функциями Win32 API.

Класс TRegistry

Прежде чем рассмотреть пример использования свойств и методов класса TRegistry, давайте кратко перечислим их.

В следующей таблице перечислены свойства класса TRegistry.

Свойство

Описание

Позволяет узнать текущую подсекцию, в которой проводятся операции по чтению и записи. Для изменения подсекции следует использовать методы OpenKey и OpenKeyReadOnly

Позволяет узнать полное название текущей подсекции

Задает способ обновления информации в реестре – непосредственно или после вызова метода CloseKey.

Задает корневую секцию в реестре. По умолчанию установлено значение HKEY_CURRENT_USER

В следующей таблице перечислены методы класса TRegistry.

Свойство

Описание

Записывает внесенные изменения и закрывает текущую подсекцию

Создает экземпляр класса TRegistry и задает значение корневой секции - HKEY_CURRENT_USER

Создает подсекцию

Удаляет подсекцию

Удаляет значение элемента

Уничтожает ранее созданный экземпляр класса TRegistry

Возвращает размер данных для указанного элемента

Возвращает тип данных для указанного элемента

Возвращает информацию о текущем элементе

Возвращает имена подсекций для указанной секции

Возвращает названия элементов для указанной подсекции

Позволяет узнать, имеются ли подсекции для указанной секции

Позволяет узнать, существует ли элемент

Создает новую подсекцию и загружает в нее информацию из указанного файла

Перемещает указанную подсекцию и все вложенные подсекции в заданное место

Открывает подсекцию

Открывает подсекцию только для чтения

Считывает данные в бинарном формате

Считывает данные в булевом формате

Считывает данные в формате валюты

Считывает данные в формате даты

Считывает данные в формате "дата/время"

Считывает данные в формате с плавающей точкой

Считывает данные в целочисленном формате

Считывает данные в строчном формате

Считывает данные в формате времени

Устанавливает соединение с реестром на другом компьютере

Переименовывает элемент

Замещает значение элемента значениями из файла

Восстанавливает значение элемента из файла

Сохраняет значение элемента в файле

Удаляет подсекцию, загруженную методом LoadKey

Позволяет узнать, существует ли значение у элемента

Записывает данные в бинарном формате

Записывает данные в булевом формате

Записывает данные в формате валюты

Записывает данные в формате даты

Записывает данные в формате "дата/время"

WriteExpandString

Записывает данные в формате "расширенно" строки

Записывает данные в формате с плавающей точкой

Записывает данные в целочисленном формате

Записывает данные в строчном формате

Записывает данные в формате времени

Работа с реестром в Delphi

Добавление элементов в контекстное меню "Создать"

  1. Создать новый документ, поместить его в папку Windows/ShellNew
  2. В редакторе реестра найти расширение этого файла, добавить новый подключ, добавить туда строку: FileName в качестве значения которой указать имя созданного файла.

Путь к файлу который открывает не зарегистрированные файлы

  1. Найтиключ HKEY_CLASSES_ROOT\Unknown\Shell
  2. Добавить новый ключ Open
  3. Под этим ключом еще ключ с именем command в котором изменить значение (По умолчанию) на имя запускаемого файла, к имени нужно добавить %1. (Windows заменит этот символ на имя запускаемого файла)

В проводнике контекстное меню " Открыть в новом окне "

  1. Найтиключ HKEY_CLASSES_ROOT\Directory\Shell
  2. Создать подключ: opennew в котором изменить значение (По умолчанию) на: "Открыть в новом окне"
  3. Под этим ключом создать еще подключ command (По умолчанию) = explorer %1

Использование средней кнопки мыши Logitech в качестве двойного щелчка

Подключ HKEY_LOCAL_MACHINE\SoftWare\Logitech и там найти параметр DoubleClick заменить 000 на 001

Новые звуковые события

Например создает звуки на запуск и закрытие WinWord

HKEY_CURRENT_USER\AppEvents\Shemes\Apps добавитьподключ WinWord икнемуподключи Open и Close.

Теперь в настройках звуков видны новые события

Путь в реестре для деинсталляции программ:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

Работа с реестром в Delphi 1

В Delphi 2 и выше появился объект TRegistry при помощи которого очень просто работать с реестром. Но мы здесь рассмотрим функции API, которые доступны и в Delphi 1.

Реестр предназначен для хранения системных переменных и позволяет зарегистрировать файлы программы, что обеспечивает их показ в проводнике с соответствующей иконкой, вызов программы при щелчке на этом файле, добавление ряда команд в меню, вызываемое при нажатии правой кнопки мыши над файлом. Кроме того, в реестр можно внести некую свою информацию (переменные, константы, данные о инсталлированной программы...). Программу можно добавить в список деинсталляции, что позволит удалить ее из менеджера "Установка/Удаление программ" панели управления.

Для работы с реестром применяется ряд функций API:

RegCreateKey (Key: HKey; SubKey: PChar; var Result: HKey): Longint;

Создать подраздел в реестре. Key указывает на "корневой" раздел реестра, в Delphi1 доступен только один - HKEY_CLASSES_ROOT, в Delphi3 - все. SubKey - имя раздела - строится по принципу пути к файлу в DOS (пример subkey1\subkey2\ ...). Если такой раздел уже существует, то он открывается (в любом случае при успешном вызове Result содержит Handle на раздел). Об успешности вызова судят по возвращаемому значению, если ERROR_SUCCESS, то успешно, если иное - ошибка.

Закрывает раздел, на который ссылается Key. Возврат - код ошибки или ERROR_SUCCESS, если успешно.

Получить имена всех подразделов раздела Key, где Key - Handle на открытый или созданный раздел (см. RegCreateKey и RegOpenKey), Buffer - указатель на буфер, cb - размер буфера, index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой (см. пример).

Задать новое значение ключу Key\SubKey, ValType - тип задаваемой переменной, Value - буфер для переменной, cb - размер буфера. В Windows 3.1 допустимо только Value=REG_SZ. Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.

{Создаем список всех подразделов указанного раздела } procedure TForm1.Button1Click(Sender: TObject); var MyKey: HKey;{ Handle для работы с разделом } Buffer: array of char; { Буфер } Err, { Кодошибки } index: longint; { Индексподраздела } begin Err:=RegOpenKey(HKEY_CLASSES_ROOT,"DelphiUnit",MyKey); { Открылираздел } if Err<> ERROR_SUCCESS then begin MessageDlg("Нет такого раздела!!",mtError,,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;

Объект INIFILES - работа с INI файлами.

Почему иногда лучше использовать INI-файлы, а не реестр?

  1. INI-файлы можно просмотреть и отредактировать в обычном блокноте.
  2. Если INI-файл хранить в папке с программой, то при переносе папки на другой компьютер настройки сохраняются. (Я еще не написал ни одной программы, которая бы не поместилась на одну дискету:)
  3. Новичку в реестре можно запросто запутаться или (боже упаси), чего-нибудь не то изменить.

Поэтому для хранения параметров настройки программы удобно использовать стандартные INI файлы Windows. Работа с INI файлами ведется при помощи объекта TIniFiles модуля IniFiles. Краткое описание методов объекта TIniFiles дано ниже.

Присвоить элементу с именем Ident раздела Section значение типа boolean

Присвоить элементу с именем Ident раздела Section значение типа String

Доступ к существующему параметру по имени Name

Пример :

Procedure TForm1.FormClose(Sender: TObject); var IniFile:TIniFile; begin IniFile:= TIniFile.Create("d:\test.INI"); { Создалиэкземпляробъекта } IniFile.WriteBool("Options", "Sound", True); { Секция Options: Sound:=true } IniFile.WriteInteger("Options", "Level", 3); { Секция Options: Level:=3 } IniFile.WriteString("Options" , "Secret password", Pass); { Секция Options: в Secret password записать значение переменной Pass } IniFile.ReadSection("Options ", memo1.lines); { Читаемименапеременных} IniFile.ReadSectionValues("Options ", memo2.lines); { Читаемименаизначения } IniFile.Free; { Закрыли файл, уничтожили объект и освободили память } end;