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