developing.ru - клуб программистов Здесь может быть и ваша реклама.
developing.ru >технология COM >
Михаил Безверхов
aspid@developing.ru

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

предыдущий выпускархив и оглавлениеследующий выпуск
Авторские права © 2001 - 2004, Михаил Безверхов
Публикация требует разрешения автора

разделы сайта

форум

технология COM

оптимизация сайтов


© 2000-2004 Клуб программистов developing.ru