Что такое "технология COM" и как с ней бороться?№8
Где COM хранит имена
статических типов...
В прошлый раз мы рассматривали
генерацию уникального идентификатора
статического типа COM-объекта. Но это только
половина всей проблемы - эти идентификаторы
нужно где-то помнить. Для этой цели в MS Windows
используется специальный системный сервис,
называемый системный реестр. Далее мы
рассмотрим этот сервис на двух уровнях. Для
тех, кто очень мало знает о системном
реестре мы рассмотрим что это такое и как с
ним обращаться далее в этой статье. Для тех,
кто уже умеет обращаться с системным
реестром, мы рассмотрим его использование в
именно в
COM в следующей статье.
Надобность возникновения
системного реестра в эволюции операционной
системы возникла очень давно. Даже
программы в такой примитивной системе как
DOS нуждались в каком-то средстве, которое
позволяло сохранять им хотя бы настроечную
информацию в промежутках между сеансами.
Традиционно это реализовывалось как особый
файл, который программа прочитывала при
старте и записывала при завершении. Те, кто
работал с Windows 3.x, может быть, еще помнят, что
этот файл имел расширение *.ini и хранился в
каталоге Windows. Каждая программа вела этот
файл самостоятельно и кто во что горазд. Всё
возрастающая сложность программ и большая
избыточность таких индивидуальных файлов
сподвигла разработчиков операционной
системы призадуматься над какой-то
централизацией и упорядочением этого
разрозненного хозяйства. Так появилась
концепция особой системной базы данных,
которая бы, если можно так выразиться,
содержала в себе информацию о "самоосознании
данной копии операционной системы"
работающей на данном компьютере.
Эта концепция и была реализована
в виде системного реестра, который
представляет собой базу данных такого
назначения и средства доступа к ней.
Средства эти глубоко интегрированы в
операционную систему, поэтому всякая
программа может воспользоваться этим
сервисом для межсеансного (постоянного,
энергонезависимого) хранения своей
информации о состоянии. Разумеется, что
первым пользователем этой базы является
сама операционная система - без нее система
оказывается хуже малого ребёнка и не может
даже загрузиться, поскольку не помнит
какими ресурсами располагает. Точнее
говоря, все свои знания о том, что она -
система, операционная система хранит
именно там.
Прежде чем рассмотреть
организацию этого хранилища, наверное,
стоит сделать и специальное примечание.
Понятие "база данных" (БД) в таком бытовом
понимании в последнее время прочно
связалось с одной частной реализацией -
реляционной базой данных, хотя на самом
деле является не чем иным, как только
концепцией. Поэтому вполне уместно
называть базой данных и вообще любое
хранилище данных вместе с унифицированными
методами доступа к нему. В этом смысле
системный реестр - самая настоящая БД
несколько непривычной в наше время
иерархической организации.
Иерархическая организация
означает, что единицы хранения в этой БД
находятся между собой в отношении "родитель-потомок"
и однозначный доступ к потомку
обеспечивается перечислением всех его
предков. Самым непосредственным примером
этого является организация файловой
системы - каталоги файловой системы могут
содержать файлы, а могут - и другие каталоги.
А для доступа к файлу необходимо
перечислить все предшествующие каталоги…
Системный реестр организован так
же. Единицами хранения в нем являются "разделы"
(keys) и "параметры" (values), которые соотносятся
с "каталогами" и "файлами" привычной
файловой системы - разделы могут содержать
в себе другие разделы и параметры, а
параметры - нет. И разделы, и параметры могут
иметь значения - числа или строки, так что
эти числа или строки адресуемы при помощи
указания цепочки разделов и параметра.
Существуют установленные
правила о структурировании информации
реестра, т.е. какого сорта информация должна
присутствовать в определенном разделе
реестра, существует набор функций Win32API,
позволяющий читать, искать, записывать и
удалять информацию и существует
специальная программа regedit.exe, которая
представляет собой графический редактор
реестра. Располагается эта программа в
каталоге "…\WinNT", но инсталлятор не
делает к ней ярлыка во время инсталляции
операционной системы. Так что запустить ее
возможно только непосредственно из
каталога.
Дальнейший рассказ о реестре
лучше читать имея эту программу запущенной
в качестве наглядной иллюстрации. Итак, в
меню кнопки "Пуск" выбираем пункт
"Выполнить/Run"
и вводим туда "С:\WinNT\regedit.exe" (если
у вас Windows обитает в каталоге C:\WinNT…, а
иначе - надо указывать тот каталог).
Запущенная программа показывает окно,
разделенное по вертикали на две неравные
части. В левой части окна показывается
пиктограмма "Мой компьютер" и значок
"плюс",
означающий, что на самом деле мы имеем
внутри скрытое дерево. Развернув дерево мы
увидим строки:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
…
которые тоже содержат в себе
деревья. Эти строки именуют части (parts)
системного реестра, каждая часть содержит в
себе информацию определенного назначения.
Например, часть HKEY_LOCAL_MACHINE содержит в себе
информацию, относящуюся к конфигурации
данного локального компьютера, а раздел
HKEY_CLASSES_ROOT является корневым для информации
о классах (статических типах) объектов,
известных операционной системе.
Раскройте раздел
HKEY_LOCAL_MACHINE,
внутри вы увидите:
HARDWARE
…
SOFTWARE
которые так же являются
деревьями. Далее раскройте раздел HARDWARE,
а внутри него - раздел DESCRIPTION, а в нём - раздел
System. Правое окно изменится - оно покажет
строки типа Identifier, VideoBiosDate и другие. Строкам
сопоставлены какие-то значения, сейчас для
нас совершенно неважно - какие.
Разделы
HKEY_… HARDWARE и т.д. являются
разделами реестра, а строки Identifier и
VideoBiosDate -
параметрами. Внимательный читатель так же
мог заметить, что когда показывается раздел,
не имеющий в себе ни одного параметра,
правое окно все-таки показывает параметр с
именем "(По умолчанию/Default)", что означает,
что некое значение можно связать не только
с параметром, но и с самим разделом.
Естественно, что редактор
реестра умеет и операции выполнять, которые
перечислены в пунктах его меню - создавать,
удалять, искать… И вот здесь самое время
сделать очень важное замечание! Системный
реестр - очень значимая и ответственная в
операционной системе сущность. Повреждение
системного реестра практически всегда
означает, что какая-то часть
функциональности операционной системы "отсыхает"
- система перестает о ней что либо знать и
"держать
во внимании". Конечно, системный реестр
специально сконструирован со способностью
противостоять сбоям и повреждениям его
целостности. Но системный реестр не может
противостоять попыткам что-то в нём удалить
или переместить из одного места в другое с
помощью редактора реестра. Ведь они же, с
точки зрения операционной системы, -
корректны.
А
вот с точки зрения пользователя, cистемный реестр - примитивная база данных. У
неё нет ни откатов, ни транзакций. То, что вы
"наворотили" прямым ходом записывается на
диск и немедленно на нём сохраняется.
Поэтому, если вы что-то "не то" удалите или
измените в системном реестре - в лучшем
случае отделаетесь потерей
функциональности какой-либо программы, а в
худшем - операционную систему придётся
переустанавливать заново. Помните об этом -
смотреть в реестре можно все (это же - ваша
машина!), а вот что-то удалять или записывать
в него - стоит хорошо подумать и твёрдо
понимать что именно вы делаете. Попытки
феноменологического исследования в
реестре "что будет, если снести вот это..."
могут очень плохо кончиться.
Здесь мы не будем подробно
рассматривать редактор реестра - уровень
нашего изложения рассчитан на программиста,
а он, в состоянии разобраться со
стандартным графическим Windows95-compatible
интерфейсом, если у него возникает такая
надобность. В конце-концов и сам редактор
системного реестра нас сейчас интересует
только как иллюстратор рассматриваемых
понятий. Нас интересует сущность -
системный реестр.