Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Управление значениями




Для перечисления значений параметров открытого раздела реестра используется функция RegEnumValue. Значение параметра dwIndex должно устанавливаться равным 0 при первом вызове функции и увеличиваться на единицу при каждом последующем вызове. После возврата из функции вы получаете строку, содержащую имя перечисляемого параметра, а также размер данных. Кроме того, вы получаете значение перечисляемого параметра и его тип.

LONG RegEnumValue(HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)

Фактическое значение параметра возвращается в буфере, на который указывает указатель lpData. Размер результата содержится в переменной, на которую указывает указатель lpcbData. Тип данных, содержащийся в переменной, на которую указывает указатель lpType, может быть самым различным, включая REG_BINARY, REG_DWORD, REG_SZ (строка) и REG_EXPAND_SZ (расширяемая строка с параметрами, которые заменяются переменными окружения). Полный список типов данных системного реестра можно найти в оперативной справочной системе.

Чтобы определить, все ли параметры перечислены, следует проверить возвращаемое значение функции. После успешного нахождения действительного параметра оно должно быть равным ERROR_SUCCESS.

Функция RegQueryValueEx ведет себя аналогичным образом, за исключением того, что требует указания имени перечисляемого параметра, а не его индекса. Эту функцию можно использовать в тех случаях, когда известны имена параметров. Если же имена параметров неизвестны, следует использовать функцию RegEnumValueEx.

Для установки значения параметра в открытом разделе служит функция RegSetValueEx, которой необходимо предоставить имя параметра, тип значения и фактические данные, образующие значение.

LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE * lpData, CONST cbData)

Наконец, для удаления именованных значений используется функция RegDeleteValue.

Пример: вывод списка разделов и содержимого реестра

Программа lsReq (программа 3.4), является видоизменением lsW (программа 3.2, предназначенная для вывода списка файлов и каталогов) и обрабатывает не каталоги и файлы, а разделы и пары "имя-значение" системного реестра.

Программа 3.4. lsReq: вывод списка разделов и содержимого системного реестра

/* Глава 3. lsReg: Команда вывода содержимого реестра. Адаптированная версия программы 3.2. */

/* lsReg [параметры] подраздел */

#include "EvryThng.h"

BOOL TraverseRegistry(HKEY, LPTSTR, LPTSTR, LPBOOL);

BOOL DisplayPair(LPTSTR, DWORD, LPBYTE, DWORD, LPBOOL);

BOOL DisplaySubKey (LPTSTR, LPTSTR, PFILETIME, LPBOOL);

 

int _tmain(int argc, LPTSTR argv[]) {

BOOL Flags[2], ok = TRUE;

TCHAR KeyName[MAX_PATH + 1];

LPTSTR pScan;

DWORD i, KeyIndex;

HKEY hKey, hNextKey;

/* Таблица предопределенных имен и дескрипторов разделов. */

LPTSTR PreDefKeyNames[] = {

_Т("HKEY_LOCAL_MACHINE"), _T("HKEY_CLASSES_ROOT"),

_Т("HKEY CURRENT USER"), _T ("HKEY CURRENT CONFIG"), NULL

};

HKEY PreDefKeys[] = {

HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG

};

KeyIndex = Options(argc, argv, _T("Rl"), &Flags[0], &Flags[1], NULL);

/* "Разобрать" шаблон поиска на "раздел" и "подраздел". */

/* Воссоздать раздел. */

pScan = argv[KeyIndex];

for (i = 0; *pScan!= _T('\\') && *pScan!= _T('\0'); pScan++, i++) KeyName [i] = *pScan;

KeyName[i] = _T('\0');

if (*pScan == _T('\\')) pScan++;

/* Преобразовать предопределенное имя раздела в соответствующий HKEY.*/

for (i = 0; PreDefKeyNames [i]!= NULL && _tcscmp(PreDefKeyNames[i], KeyName)!= 0; i++);

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

В последующих главах будут рассмотрены такие усовершенствованные методы ввода/вывода, как асинхронные операции ввода/вывода и отображение файлов. Этих средств будет достаточно для того, чтобы воспроизвести в Windows почти любой из обычных видов обработки файлов, доступных при использовании UNIX или библиотечных функций С.

В приложении Б приведены сравнительные таблицы функций Windows, UNIX и библиотеки С, в которых наглядно показано, в чем указанные группы функций соответствуют друг другу, а в чем заметно отличаются.





Поделиться с друзьями:


Дата добавления: 2015-09-20; Мы поможем в написании ваших работ!; просмотров: 638 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Начинайте делать все, что вы можете сделать – и даже то, о чем можете хотя бы мечтать. В смелости гений, сила и магия. © Иоганн Вольфганг Гете
==> читать все изречения...

2286 - | 2070 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.