Структура системного реестра подобна структуре каталогов: эквивалентом каталога является ключ, а файла – значение. Ключ содержит подключи и значения. Системный реестр Windows XP хранит информацию о конфигурации системы. В целом системный реестр имеет древовидную структуру. Основными ветвями системного реестра являются:
HKEY_CLASSES_ROOT – содержит определения типов документов, связей с файлами и интерфейса командного процессора;
HKEY_CURRENT_USER – содержит параметры настройки текущего пользователя;
HKEY_LOCAL_MACHINE – хранит аппаратные конфигурации, сетевые протоколы и классы программного обеспечения;
HKEY_USERS – используется для хранения выбранных пользователями глобальных параметров (цвет, звук и т.д.), а также параметры настройки рабочего стола;
HKEY_CURRENT_CONFIG – ключ устанавливает связь с ключом отображения, входящим в состав выбранной конфигурации config из HKEY_LOCAL_MACHINE;
HKEY_PERFORMANCE_DATA (Windows 2000 и выше) или HKEY_DYN_DATA (Windows 9x) – хранит данные о каждом аппаратном компоненте системы и данные о производительности системы.
Наиболее часто встречаемые типы значений в реестре: строковый (REG_SZ), двоичный (REG_BINARY), двойное слово (REG_DWORD).
Функции для работы с реестром, используемые при выполнении индивидуальных заданий:
RegCloseKey – закрывает открытый ключ системного реестра
RegCreateKeyEx – создает новый подключ
RegDeleteKey – удаляет ключ из системного реестра
RegDeleteValue – удаляет значение из системного реестра
RegEnumKeyEx – перечисляет все ключи данного ключа
RegEnumValue – перечисляет все значения данного ключа
RegFlushKey – сразу же записывает все изменения, произведенные в системном реестре
RegNotifyChangeKeyValue – указывает на момент изменения ключа или значения в системном реестре
RegOpenKeyEx – открывает существующий ключ системного реестра
RegQueryInfoKey – возвращает информацию о ключе
RegQueryValueEx – возвращает значение ключа
RegSetValueEx – присваивает ключу значение
ПРЕДУПРЕЖДЕНИЕ: Никогда не изменяйте содержимое реестра, если не знаете его назначения!!! Некорректное изменение данных может привести к сбоям в работе операционной системы Windows!!!
Пример. Программа при отсутствии ключа в реестре создает его, при наличии – выводит все значения ключа и удаляет его.
#include <windows.h>
#include <stdio.h>
HKEY hk;
CHAR szBuf[80];
DWORD dwData, dwDsp, dwValues, dwMaxValueNameLen, dwMaxValueData,
dwNameLen, dwValueData, dwIndex, dwType;
LONG lReturn;
LPTSTR lpszVN1, lpszVN2;
int main()
{
//Создаем ключ в реестре
if (RegCreateKeyEx( HKEY_CURRENT_USER, //ветвь
"Software\\MyLabSPO", //ключ
0, //зарезервировано (должно быть 0)
"", // имя класса (нам не нужно)
REG_OPTION_NON_VOLATILE, // сохранить ключ на диске
KEY_ALL_ACCESS, // полный доступ
NULL, // защита по умолчанию
&hk, //дескриптор нового ключа
&dwDsp)) // состояние ключа (открыт, создан)
{
printf("Key Creation Error\n"); return(0);
}
if (dwDsp==REG_OPENED_EXISTING_KEY)
{
printf("Key Found\n");
// закрытие дескриптора ключа
RegCloseKey(hk);
// открытие ключа
// приведено для примера - в данном случае достаточно
// проанализировать dwDsp==REG_OPENED_EXISTING_KEY
if (RegOpenKeyEx( HKEY_CURRENT_USER,
"Software\\MyLabSPO",
0,
KEY_ALL_ACCESS,
&hk))
{
printf("Key Open Error\n"); return(0);
}
// Определяем нужные параметры для чтения ключа
// задаем только нужные нам данные
RegQueryInfoKey( hk,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&dwValues, // число значений в ключе
&dwMaxValueNameLen, // максимальная длина имени значения
&dwMaxValueData, // максимальная длина значения
NULL,
NULL );
printf("Values:%d,Max Value Name Length:%d,Max Data Length:%d\n",
dwValues, dwMaxValueNameLen, dwMaxValueData);
// так как строки завершаются 0 - добавляем 1 байт
dwMaxValueNameLen++;
dwMaxValueData++;
// выделяем память для хранения строк
lpszVN1 = (LPTSTR)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwMaxValueNameLen );
lpszVN2 = (LPTSTR)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwMaxValueData );
// читаем значения ключа
do
{
dwNameLen = dwMaxValueNameLen;
dwValueData = dwMaxValueData;
lReturn = RegEnumValue( hk, dwIndex, lpszVN1,
&dwNameLen, 0, &dwType,
(unsigned char *)lpszVN2, &dwValueData );
if (lReturn != ERROR_NO_MORE_ITEMS )
{
printf("%s = %s\n", lpszVN1, lpszVN2);
dwIndex++;
}
}
while( lReturn != ERROR_NO_MORE_ITEMS );
// освобождаем занятую ранее память
if ( lpszVN1 ) HeapFree( GetProcessHeap(), 0, lpszVN1 );
if ( lpszVN2 ) HeapFree( GetProcessHeap(), 0, lpszVN2 );
// удаляем параметры ключа
if (RegDeleteValue( hk, "File Name" ))
printf("Value 1 Delete Error\n");
if (RegDeleteValue( hk, "Application Run" ))
printf("Value 2 Delete Error\n");
// удаляем ключ
if (RegDeleteKey( hk, "" ))
{
printf("Key Delete Error\n");
} else
{
printf("Key Deleted Successfull\n");
}
}
else
{
printf("Key Not Found\nCreated Successfull\n");
strcpy(szBuf, "My Program");
// создаем параметр ключа
if (RegSetValueEx( hk, // дескриптор ключа
"File Name", // имя значения
0, //зарезервировано (должно быть 0)
REG_SZ, // тип значения
(LPBYTE) szBuf, // значение
strlen(szBuf) + 1)) //длина значения
{
printf("Value 1 Set Error\n"); RegCloseKey(hk); return(0);
}
dwData = 1;
if (RegSetValueEx( hk,
"Application Run",
0,
REG_DWORD,
(LPBYTE) &dwData,
sizeof(DWORD)))
{
printf("Value 2 Set Error\n"); RegCloseKey(hk); return(0);
}
}
RegCloseKey(hk);
return 0;
}
Источник: Панченко В.І та ін. Системне програмне забезпечення Windows [текст] навч. посібник П16 [з дисципліни "Системне програмне забезпечення"] / В.І. Панченко, А. М. Клименко, И. В. Максита, - Харків: НТУ "ХПІ", 2009 - 196 с.