Лекції з WinApi
Тема №7 Системний реєстр
7. Системний реєстр
7.1. Загальна структура системного реєстру
Системний реєстр (registry) - спеціальна системна база даних, у якій додатки й операційна система можуть зберігати інформацію про конфігурацію.
Операційна система використовує системний реєстр у такий спосіб:
- При запуску програми установки Windows (Windows setup), додаванні нового обладнання через панель чи керування запуску програм установки устаткування, операційна система (Configuration manager) додає до реєстру інформацію об устаткування. У реєстрі міститься повний список пристроїв.
- При установці Windows “поверх” попередньої версії до реєстру переноситься інформація з INI файлів.
- При чи додаванні видаленні пристроїв, що підтримують специфікацію Plug and Play, що відповідає інформація заноситься в registry.
- Драйвери пристроїв зчитують з реєстру настроювання, подібно тому, як це робиться при використанні рядка device= файлу CONFIG.SYS.
- З реєстром працюють різні адміністративні програми, наприклад Панель Керування (Control Panel).
Дані в системному реєстрі зберігаються в двійковому виді. Для роботи з ними додатки повинні використовувати спеціальні системні функції.
Дані в реєстрі організовані у виді дерева. Вузли цього дерева називаються ключами (key). Кожен ключ може містити будь-яку кількість підключей і значень (values). Кожен ключ має ім'я складається з одного чи декількох символів. Ім'я не може містити в собі пробіли, зворотну косу рису, символи “*” і “?”. Імена ключів, що починаються з крапки зарезервовані. Ім'я підключа повинне бути унікальним відносно выщележачого ключа.
Додаток повинний відкрити ключ перед тим як додавати в нього дані. Для того, щоб відкрити новий ключ, додаток повинний надати системі уже відкритий раніше ключ. Для того, щоб це було можливе система завжди надає два відкритих ключі (HKEY_LOCAL_MACHINE і HKEY_USERS). Перший містить інформацію описваючу можливі конфігурації комп'ютера, другий - усіх користувачів. Додаток використовує ці ключі, як крапки входу до реєстру. Крім цього завжди визначені два інших ключі, що містять посилання на актуальні підключи цих ключів. Один з них, HKEY_CLASSES_ROOT, описує актуальну конфігурацію програмного забезпечення комп'ютера з HKEY_LOCAL_MACHINE, інший, HKEY_CURRENT_USER, посилається на працюючого користувача з HKEY_USERS. Значення інших ключів системно залежно. Як приклад розглянемо реєстр Windows’95.
7. Системний реєстр.
7.2. Системний реєстр Windows’95.
Системний реєстр Windows’95 має наступну структуру:
Ключ |
Збережена інформація |
HKEY_LOCAL_MACHINE |
Специфічна для даного комп'ютера інформація, що використовується всіма користувачами комп'ютера. Використовуються наступні підключи (папки)
|
HKEY_CURRENT_CONFIG |
Указує на актуальний підключ ключаHKEY_LOCAL_MACHINE\Config |
HKEY_DYN_DATA |
Містить посилання на частину інформації вHKEY_LOCAL_MACHINE, що відноситься до пристроїв Plug and Play, Ця інформація змінюється при підключенні і відключенні пристроїв. |
HKEY_CLASSES_ROOT |
Містить посилання на частину інформації вHKEY_LOCAL_MACHINE, що відноситься до програмного забезпечення. |
HKEY_USERS |
Містить інформацію про всіх користувачів, що працюють на даному комп'ютері. Кожному користувачу виділяється підключ. |
HKEY_CURRENT_USER |
Містить посилання на підключ, що відповідає користувачу, що працює із системою в сучасний момент часу. |
7. Системний реєстр.
7.3. Робота додатків із системним реєстром.
Формально, додатки можуть зберігати в реєстрі будь-які дані, однак вони повинні дотримувати наступних “правил поведінки”:
- До реєстру записуються тільки дані про конфігурацію й ініціалізацію додатка. Інші дані повинні зберігатися в іншім місці.
- Дані, що мають розмір більше двох кілобайт повинні зберігатися у файлі. До реєстру записується ім'я цього файлу.
- Код, що виконується, не повинний зберігатися в реєстрі.
- Значення займають менше місця, чим ключі. Додаток повинний, по можливості, групувати свої дані в структуру, а не створювати ключ для кожного елемента даних
Перед записом інформації до реєстру необхідно визначити, до чого відноситься ця інформація: чи є вона загальної для всіх користувачів чи комп'ютера специфічна для кожного окремого користувача
Інформація загальна для всіх користувачів повинна заноситися в ключ виду:
HKEY_LOCAL_MACHINE\Software\MyCompany\MyProduct\1.0
Інформація специфічна для користувача повинна заноситися в ключ виду:
HKEY_CURRENT_USER\Software\MyCompany\MyProduct\1.0\...
Нижче перераховані деякі функції, призначені для роботи із системним реєстром
Функція |
Виконувана дія |
RegCreateKey RegCreateKeyEx |
Створення підключа |
RegOpenKey RegOpenKeyEx |
Одержання описувача існуючого ключа (відкриття ключа) |
RegSetValue RegSetValueEx |
Запис нового імені даних у ключі і запис цих даних |
RegQueryValue RegQueryValueEx |
Читання значення з ключа по імені даних |
RegEnumValue |
Читання значення з ключа по номері даних |
RegCloseKey |
Закриття ключа і відновлення реєстру |
RegNotifyChangeKeyValue |
Визначення події, що повинне відбутися при зміні заданого значення в реєстрі (див. 6.2.5). |
Приклад програми, що працює з реєстром
#include <windows.h>
#include <stdio.h>
main()
{ HKEY MyKey ;
LONG ErrorCode ;
char Value[80] ;
char Name[80] ;
DWORD NameSize ;
DWORD ValueSize ;
int і ;
/* Створення нового підключа */
ErrorCode = RegCreateKey(HKEY_CURRENT_USER,
"\\Software\\MyCompany\\MyProduct\\1.0\\aaa",
&MyKey );
if ( ERROR_SUCCESS != ErrorCode )
return 1 ;
/* Запис у підключ десятьох нових даних з ім'ям Namex і значенням Valuex */
for ( i = 0 ; i < 10 ; i++ ) {
sprintf( Name, "Name%d", i ) ;
sprintf( Value, "Value%d", i ) ;
ErrorCode = RegSetValueEx( MyKey,Name,0,REG_SZ,
Value,strlen(Value)+1);
if ( ERROR_SUCCESS != ErrorCode )
return 2 ;
}
/* Читання з підключа всіх записаних значень по номеру і й їх друк */
for ( i = 0 ; ; i++ ) {
NameSize = sizeof( Name );
ValueSize = sizeof( Value );
ErrorCode = RegEnumValue( MyKey, i, Name, &NameSize,
0,NULL, Value, &ValueSize ) ;
if ( ErrorCode != ERROR_SUCCESS )
break ;
printf( "%d: %s -- %s\n", i, Name, Value ) ;
}
RegCloseKey( MyKey ) ;
return 0 ;
}