Чтение онлайн

на главную - закладки

Жанры

Системное программирование в среде Windows

Харт Джонсон М.

Шрифт:

 hKey = PreDefKeys[i];

 RegOpenKeyEx(hKey, pScan, 0, KEY_READ, &hNextKey);

 hKey = hNextKey;

 ok = TraverseRegistry(hKey, argv[KeyIndex], NULL, Flags);

 return ok ? 0 : 1;

}

BOOL TraverseRegistry(HKEY hKey, LPTSTR FullKeyName, LPTSTR SubKey, LPBOOL Flags)

/*Совершить обход разделов и подразделов реестра,
если задан параметр –R.*/

{

 HKEY hSubK;

 BOOL Recursive = Flags[0];

 LONG Result;

 DWORD ValType, Index, NumSubKs, SubKNameLen, ValNameLen, ValLen;

 DWORD MaxSubKLen, NumVals, MaxValNameLen, MaxValLen;

 FILETIME LastWriteTime;

 LPTSTR SubKName, ValName;

 LPBYTE Val;

 TCHAR FullSubKName[MAX_PATH + 1];

 /* Открыть дескриптор раздела. */

 RegOpenKeyEx(hKey, SubKey, 0, KEY_READ, &hSubK);

 /* Определить максимальный размер информации относительно раздела и распределить память. */

 RegQueryInfoKey(hSubK, NULL, NULL, NULL, &NumSubKs, &MaxSubKLen, NULL, &NumVals, &MaxValNameLen, &MaxValLen, NULL, &LastWriteTime);

 SubKName = malloc (MaxSubKLen+1); /* Размер без учета завершающего нулевого символа. */

 ValName = malloc(MaxValNameLen+1); /* Учесть нулевой символ. */

 Val = malloc(MaxValLen); /* Размер в байтах. */

 /* Первый проход: пары "имя-значение". */

 for (Index = 0; Index < NumVals; Index++) {

ValNameLen = MaxValNameLen + 1; /* Устанавливается каждый раз! */

ValLen = MaxValLen + 1;

RegEnumValue(hSubK, Index, ValName, &ValNameLen, NULL, &ValType, Val, &ValLen);

DisplayPair(ValName, ValType, Val, ValLen, Flags);

 }

 /* Второй проход: подразделы. */

 for (Index = 0; Index < NumSubKs; Index++) {

SubKNameLen = MaxSubKLen + 1;

RegEnumKeyEx(hSubK, Index, SubKName, &SubKNameLen, NULL, NULL, NULL, &LastWriteTime);

DisplaySubKey(FullKName, SubKName, &LastWriteTime, Flags);

if (Recursive) {

_stprintf(FullSubKName, _T("%s\\%s"), FullKName, SubKName);

TraverseRegistry(hSubK, FullSubKName, SubKName, Flags);

}

 }

 _tprintf(_T("\n"));

 free(SubKName);

 free(ValName);

 free(Val);

 RegCloseKey(hSubK);

 return TRUE;

}

BOOL DisplayPair(LPTSTR ValueName, DWORD ValueType, LPBYTE Value, DWORD ValueLen, LPBOOL Flags)

/*
Функция, отображающая пары "имя-значение". */

{

 LPBYTE pV = Value;

 DWORD i;

 _tprintf(_T("\nValue: %s = "), ValueName);

 switch (ValueType) {

 case REG_FULL_RESOURCE_DESCRIPTOR: /* 9: описание оборудования. */

 case REG_BINARY: /* 3: Любые двоичные данные. */

for (i = 0; i < ValueLen; i++, pV++) _tprintf (_T (" %x"), *pV);

break;

 case REG_DWORD: /* 4: 32-битовое число. */

_tprintf(_T ("%x"), (DWORD)*Value);

break;

 case REG_MULTI SZ: /*7: массив строк, завершающихся нулевым символом.*/

 case REG_SZ: /* 1: строка, завершающаяся нулевым символом. */

_tprintf(_T("%s"), (LPTSTR)Value);

break;

 /* … Несколько других типов … */

 }

 return TRUE;

}

BOOL DisplaySubKey(LPTSTR KeyName, LPTSTR SubKeyName, PFILETIME pLastWrite, LPBOOL Flags) {

 BOOL Long = Flags[1];

 SYSTEMTIME SysLastWrite;

 _tprintf(_T("\nSubkey: %s"), KeyName);

 if (_tcslen(SubKeyName) > 0) _tprintf (_T ("\\%s "), SubKeyName);

 if (Long) {

FileTimeToSystemTime(pLastWrite, &SysLastWrite);

_tprintf(_T("%02d/%02d/%04d %02d:%02d:%02d"), SysLastWrite.wMonth, SysLastWrite.wDay, SysLastWrite.wYear, SysLastWrite.wHour, SysLastWrite.wMinute, SysLastWrite.wSecond);

 }

 return TRUE;

}

Резюме

В главах 2 и 3 описаны все наиболее важные базовые функции, необходимые для работы с файлами, каталогами и консольным вводом/выводом. Использование этих функций для построения типичных приложений иллюстрировали многочисленные примеры. Как показывает последний из примеров, между управлением системным реестром и управлением файловой системой имеется много общего.

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец