В системном реестре хранится информация о конфигурации системы в среде Win32. Структура системного реестра подобна структуре каталогов: эквивалентом каталога является ключ, а файла – значение. Ключ содержит подключи и значения. В целом системный реестр имеет древовидную структуру. Основными ветвями системного реестра являются:
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).
Функции для работы с реестром, используемые при выполнении индивидуальных заданий:
RegFlushKey – сразу же записывает все изменения, произведенные в системном реестре
RegNotifyChangeKeyValue – указывает на момент изменения ключа или значения в системном реестре
ПРИМЕЧАНИЕ: В данной работе необходимо использовать только СВОИ уникальные ключи в реестре (только в разделе HKEY_CURRENT_USER), изменение или удаление существующих ключей ЗАПРЕЩЕНО!!!
Пример. Программа при отсутствии ключа в реестре создает его, при наличии – выводит все значения ключа и удаляет его.
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;
}
Постановка задачи: разработать оконное приложение в среде программирования Visual C в соответствии с заданным вариантом. Для хранения промежуточных результатов можно использовать средства WIN32 API для работы с памятью.
Порядок выполнения работы
1. Ознакомиться с постановкой задачи и исходными данными. В соответствии с номером по журналу определить вариант задачи.
2. Согласно рекомендациям, приведенным в исходных данных, сконструировать структуру программы.
3. Составить тексты программ и утвердить их у преподавателя.
4. Пункты 1 - 3 должны быть выполнены предварительно до проведения данной лабораторной работы. Утверждение преподавателем текстов программ является допуском к лабораторной работе.
5. Набрать текст программы.
6. Выполнить компиляцию программы.
7. Провести анализ и исправление обнаруженных синтаксических ошибок в тексте программы и повторить пункты 6. и 7. При устранении всех синтаксических ошибок перейти к выполнению пункта 8.
8. Получить решение и, в случае обнаружения логических ошибок, описать и устранить их. Продемонстрировать преподавателю окончательный вариант программы и ее работу.
Содержание отчета
1. Тема лабораторной работы.
2. Цель работы.
3. Индивидуальное задание.
4. Метод и алгоритм решения задачи.
5. Текст программы.
6. Результаты работы программы.
7. Выводы по работе.
Индивидуальные задания
15. Написать программу, которая отслеживает изменение даты на компьютере в сторону уменьшения.