Содержание Назад Дальше

Системный реестр

Системый реестр — это древовидная структура данных, в который вы можете хранить настройки своей программы. Помимо вас, в реестр складывают данные другие программы, в том числе и операционная система.

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

Итак, реестр состоит из нескольких крупных деревьев, каждое из которых имеет уникальное название. Нас будут интересовать только два из них: HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE.

Дерево HKEY_LOCAL_MACHINE (часто сокращаемое до HKLM) может содержать настройки программы для текущей машины безотносительно к тому, кто за ней работает. В Windows NT пользователи, не обладающие правами администратора, не могут записывать данные в это дерево. Из этого следует один простой вывод — если программа имеет общепользовательские настройки, то устанавливать её на компьютер (и изменять эти настройки впоследствии) может только администратор.

HKEY_CURRENT_USER (HKCU) содержит настройки программы для текущего пользователя. Это дерево для каждого пользователя компьютера своё. Оно может храниться не только на локальной машине, но и на сервере, что позволяет пользователю на каждом компьютере сети иметь одни и те же настройки (обои, клавиши переключения раскладки и др.).

Для того, чтобы просматривать и редактировать реестр, вы можете запустить редактор реестра (эта программа, как и следовало ожидать, называется regedit.exe :) Если вы часто работаете с реестром, её лучше всего вынести в меню "Программы".

Деревья реестра состоят из разделов (keys, в редакторе реестра они выглядят, как папки). У каждого раздела могут пыть различные параметры (values). По крайней мере один параметр есть у каждого раздела — в редакторе реестра он называется "(По умолчанию)" (в английской версии, естественно, "(Default)").

Как работать с реестром, вы можете прочитать в документации (ключевое слово TRegistry). Я же всего лишь отмечу, что выбрать дерево вы можете, используя свойство RootKey; для чтения/записи данных, вам потребуется открыть раздел (метод OpenKey); чтобы данные сохранились, не забудьте раздел закрыть (метод CloseKey). Название параметра по умолчанию — пустая строка.

В Windows регламентированы правила записи параметров программы в реестр. Вы, конечно, можете помещать данные куда угодно, однако, знать эти правила вам не помешает.

В соответствии с правилами, параметры программы должны находиться в \Software\<Название фирмы>\<Название программы>\<Версия> Реальное же расположение поддерева вашей программы зависит только от вас. Если вам не требуется навороченной схемы работы с версиями, вы можете отказаться от <Версии>. Если у вас нет собственной фирмы :), можно отказаться и от <Названия фирмы> (но документация жутко не рекомендует этого делать). Например, программы RAR и FAR Евгения Рошала прописывают свои параметры в ветках HKCU\Software\WinRAR и HKCU\Software\FAR.

В реестре хранится куча полезной информации. Ниже я немного расскажу вам об этом, но прежде хочу заметить, что большая часть данных Windows находится в ветках HKLM\Software\Microsoft\Windows\CurrentVersion
и HKCU\Software\Microsoft\Windows\CurrentVersion
, поэтому в дальнейшем, в целях сокращения, я вместо Software\Microsoft\Windows\CurrentVersion
буду просто ставить три точки.

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

Нам потребуется раздел HKCU\...\Explorer\Shell Folders (обратите внимание, что Shell Folders пишется через пробел). Этот раздел содержит такие параметры (и не только их):

DesktopРабочий стол (папка).
FavoritesИзбранное (папка).
PersonalМои документы (папка).
ProgramsМеню Программы (папка).
Start MenuМеню кнопки Пуск (папка).
StartupМеню Автозагрузка (папка).
TemplatesШаблоны документов (папка).

Обычно, в эти каталоги помещаются не сами файлы, а ссылки на них (о ссылках мы поговорим чуть позже).

В NT существует ещё несколько папок, которые связаны с "меню для всех". Раздел, где их можно найти, практически такой же: HKLM\...\Explorer\Shell Folders (заметьте, что теперь он принадлежит ветке HKLM, а не HKCU).

Common DesktopРабочий стол (папка).
Common ProgramsМеню Программы (папка).
Common Start MenuМеню кнопки Пуск (папка).
Common StartupМеню Автозагрузка (папка).

Обратите внимание на наличие пробела после слова Common.

Если вы хотите, чтобы ваша программа деинсталляции появилась в стандартном списке деинсталляторов (Панель управления/Установка и удаление программ/Закладка "Установка/Удаление"), вы можете прописать её в реестре. Создайте в ветке HKLM\...\Uninstall раздел с произвольным именем (чаще всего используют название программы) и добавьте к нему два строковых параметра: DisplayName (то, что будет показано в списке готовых к деинсталляции программ) и UninstallString (командная строка запуска деинсталлятора — можно использовать параметры).

В списке, на рисунке справа, вы видите, о каких названиях идёт речь.

Если вы инсталлируете на компьютер разделяемые файлы (которыми могут пользоваться два или более приложений), пропишите их в HKLM\...\SharedDLLs (выше вы видели окно редактора реестра, в котором как раз показаны параметры раздела SharedDLLs). Названием параметра служит имя разделяемого файла, а значением (целого типа) — количество ссылок на него. При инсталляции файла вы проверяете, существует ли он в реестре, и если да, просто увеличиваете количество ссылок на единицу. Если разделяемого файла в реестре нет, создайте его, и установите количество ссылок равным единице. При деинсталляции файла уменьшите количество ссылок на 1, и если оно стало равным нулю — удаляйте его.

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

Напоследок рассмотрим ещё несколько интересных разделов реестра. В ветках HKCU\...\Run, HKLM\...\Run, HKLM\...\RunOnce и HKLM\...\RunServiceOnce можно прописывать программы, которые вы хотите запускать при включении компьютера или входе в систему. Названием параметра может служить произвольная строка, а значением (строковым) будет путь к программе, которую вы хотите запустить.

Раздел Run просто запускает указанную программу всякий раз, когда пользователь входит в систему (действует аналогично папке Автозагрузка). Раздел RunOnce работает так же, как и Run, однако после выполнения программы, её параметр из RunOnce удаляется — это приводит к тому, что программа запускается только один раз. Наконец, RunServiceOnce действует точно также, как и RunOnce, но выполняется при включении компьютера, то есть ещё до того, как пользователь вошёл в систему.

Излишне, наверное, говорить, что HKCU\...\Run выполняется только для одного конкретного пользователя, а HKLM\...\Run — для любого пользователя компьютера.

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

Для этого нам придётся исследовать ещё одну ветку реестра — HKEY_CLASSES_ROOT (HKCR).

Примечание:
Эта ветка появилась в реестре самой первой (если углябляться в историю) и служила для хранения данных о COM-объектах (о тех же OLE-серверах, например), доступных системе. Это было ещё в Windows 3.x, то есть очень давно :)
Сейчас в реестре появилось ещё несколько веток, и поэтому HKEY_CLASSES_ROOT потеряла своё привилегированное положение. В связи с тем, что она обслуживает не только типы файлов, но и COM, ситуация с реестром немного запутанная. Мы разберём возможности этой ветки на примере программы WinRAR Евгения Рошала.
[HKEY_CLASSES_ROOT\.rar] @="WinRAR" "Content Type"="application/x-compressed" [HKEY_CLASSES_ROOT\.rar\ShellNew] "Data"=hex:52,61,72,21,1a,07,00,cf,
90,73,00,00,0d,00,00,00,00,00,00,00 [HKEY_CLASSES_ROOT\WinRAR] @="WinRAR archive" [HKEY_CLASSES_ROOT\WinRAR\shell] [HKEY_CLASSES_ROOT\WinRAR\shell\open] [HKEY_CLASSES_ROOT\WinRAR\shell\open\command] @="C:\\Program Files\\WinRAR\\WinRAR.exe \"%1\"" [HKEY_CLASSES_ROOT\WinRAR\DefaultIcon] @="C:\\Program Files\\WinRAR\\WinRAR.exe,0"
Для начала необходимо создать раздел HKCR\.ext (здесь ext — расширение файлов, с которым работает ваша программа). Параметром по умолчанию этого раздела должна быть некая уникальная строка (в нашем примере это WinRAR). Вы можете использовать имя программы, имя программы плюс тип, имя программы и версию, имя своей любимой бабушки, и вообще, любое имя. Далее этот идентификатор я буду называть ExtentionID.

Дополнительный возможный (необязательный) параметр — это Content type.

Необязательный подраздел HKEY_CLASSES_ROOT\.ext\ShellNew используется для того, чтобы пользователь мог создавать в Проводнике файлы вашего типа (правая кнопка мыши/Создать/...).

Следующий раздел — HKCR\ExtentionID. Значением по умолчанию этого раздела будет название файлов данного типа, например, WinRAR archive или Документ Microsoft Word. Это название используется Проводником (в том числе, и в подменю создания файлов). В дальнейшем эту строку я буду называть DocumentName.

Добавьте раздел HKCR\ExtentionID\shell\open\command для того, чтобы пользователь мог открывать файлы вашего типа двойным щелчком. Поскольку такой файл зачастую содержит несколько иконок, в случае необходимости указывайте порядковый номер иконки (нумеруются, начиная с нуля).

И, немного о том, как создаются новые файлы. Выше я написал, что для создания нового файла используется раздел HKEY_CLASSES_ROOT\.ext\ShellNew. В этом разделе может находится один из трёх параметров: FileName, Command и Data. В FileName записывается имя файла, который должен находится в каталоге с шаблонами документов (там лежат пустые файлы зарегестрированных типов) — он будет скопирован в указанный каталог с новым именем DocumentName.ext.

Примечание:
Каталог с шаблонами документов (см. таблицу выше), можно найти в разделах Shell Folders/User Shell Folders, параметр Templates.

Command задаёт имя программы, которая должна вызываться для создания файла. Этой программе может быть передан параметр — имя нового файла (DocumentName.ext).

Если пустой файл указанного типа очень прост, и состоит из нескольких байт, мы можем записать эти байты в реестр, в параметр Data. Проводник создаст новый файл DocumentName.ext, и скопирует эти данные в него.

Содержание Назад Дальше