Системый реестр — это древовидная структура данных, в который вы можете
хранить настройки своей программы. Помимо вас, в реестр складывают данные другие
программы, в том числе и операционная система.
Реестр является не только важным этапом во время инсталляции, но и прекрасным
источником самой различной информации, поэтому я остановлюсь на нём подробнее.
Итак, реестр состоит из нескольких крупных деревьев, каждое из которых имеет
уникальное название. Нас будут интересовать только два из них:
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, и скопирует эти данные в него.
|