Работа с подключами в реестре

Следующий пример демонстрирует использование функций RegQueryInfoKey, RegEnumKeyEx, и RegEnumValue. Параметр hKey передаётся в каждую функцию, как дескриптор открытого ключа. Этот ключ должен быть открыт до того как будет вызвана функция и закрыт после. 
// QueryKey - Функция позволяет узнать все подключи ключа и связанные
// с ним значения, а затем копирует значения в пару: окошко
// редактирования и список.
// hDlg - Диалоговое окно, которое содержит окошки редактирования и
// списки.
// hKey - Ключ, у которого мы хотим посмотреть подключи.

void QueryKey(HWND hDlg, HANDLE hKey)
{
CHAR achKey[MAX_PATH];
CHAR achClass[MAX_PATH] = ""; // буфер для имени класса
DWORD cchClassName = MAX_PATH; // размер строки класса
DWORD cSubKeys; // количество подключей
DWORD cbMaxSubKey; // самый длинный подключ
DWORD cchMaxClass; // самая длинная строка класса
DWORD cValues; // кол-во значений для ключа
DWORD cchMaxValue; // самое длинное имя
DWORD cbMaxValueData; // самые длинные данные
DWORD cbSecurityDescriptor;
FILETIME ftLastWriteTime;

DWORD i, j;
DWORD retCode, retValue;

CHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
CHAR achBuff[80];

// Получаем имя класса и количество значений.
RegQueryInfoKey(hKey, // дескриптор ключа
achClass, // буфер для имени класса
&cchClassName, // размер строки класса
NULL, // зарезервировано
&cSubKeys, // количество подключей
&cbMaxSubKey, // самый длинный подключ
&cchMaxClass, // самая длинная строка класса
&cValues, // кол-во значений для этого ключа
&cchMaxValue, // самое длинное имя
&cbMaxValueData, // самые длинные данные
&cbSecurityDescriptor,
&ftLastWriteTime);

SetDlgItemText(hDlg, IDE_CLASS, achClass);
SetDlgItemInt(hDlg, IDE_CVALUES, cValues, FALSE);

SendMessage(GetDlgItem(hDlg, IDL_LISTBOX),
LB_ADDSTRING, 0, (LONG) "..");

// Перечисление дочерних ключей идёт до тех пор, пока RegEnumKeyEx не
// выдаст ошибку. Затем получаем имя каждого ключа и копируем его
// в список.

SetCursor(LoadCursor(NULL, IDC_WAIT));
for (i = 0, retCode = ERROR_SUCCESS;
retCode == ERROR_SUCCESS; i++)
{
retCode = RegEnumKeyEx(hKey,
i,
achKey,
MAX_PATH,
NULL,
NULL,
NULL,
&ftLastWriteTime);
if (retCode == (DWORD)ERROR_SUCCESS)
{
SendMessage(GetDlgItem(hDlg, IDL_LISTBOX),
LB_ADDSTRING, 0, (LONG) achKey);
}
}
SetCursor(LoadCursor (NULL, IDC_ARROW));

// Получаем значения ключа.
SetCursor(LoadCursor(NULL, IDC_WAIT));

if (cValues)
{
for (j = 0, retValue = ERROR_SUCCESS;
j < cValues; j++)
{
cchValue = MAX_VALUE_NAME;
achValue[0] = '\0';
retValue = RegEnumValue(hKey, j, achValue,
&cchValue,
NULL,
NULL, // &dwType,
NULL, // &bData,
NULL); // &bcData

if (retValue == (DWORD) ERROR_SUCCESS )
{
achBuff[0] = '\0';

// Добавляем каждое значение в список.
if (!lstrlen(achValue))
lstrcpy(achValue, "<NO NAME>");
wsprintf(achBuff, "%d) %s ", j, achValue);
SendMessage(GetDlgItem(hDlg,IDL_LISTBOX2),
LB_ADDSTRING, 0, (LONG) achBuff);
}
}

SetCursor(LoadCursor(NULL, IDC_ARROW));
}
Читайте также:
  • Низкоуровневые процедуры обработки звука
    Ниже приведен код, обрабатывающий аудиосигнал, получаемый со входа звуковой карты (SoundBlaster). Надеюсь он поможет разобраться вам с этой сложной темой. Включенный в код модуль RECUNIT делает всю изнурительную работу по извлечению звука со входа звуковой карты.       Var WaveRe...
  • Использование анимированных курсоров
    (mycursor.ani - файл, содержащий анимированный курсор. Вы можете создать его с помощью программы Microsoft aniedit.exe) const crMyCursor = 1;procedure TForm1.FormCreate(Sender: TObject);begin // Загружаем курсор. Единственный способ для этого Screen.Cursors[crMyCursor] :=LoadCursorFromFile('c...
  • Определение и использование курсора
    Сначала (поскольку многие попадаются в эту ловушку) убедитесь в том, что имя .RES-файла, в котором вы храните ваш курсор, отличается от имени .RES-файла вашего проекта, т.е., если ваш проект имеет имя MyApp.DPR, то не используйте для хранения новых ресурсов файл MyApp.RES. Вы должны создать отдел...
  • Как минимизиpовать все запущеные окна
    /* Hачало (MINIMIZE.DPR){$APPTYPE CONSOLE}program Minimize;uses Windows,Messages;var Count:integer;function EnumProc (WinHandle: HWnd; Param: LongInt): Boolean; stdcall;begin if (GetParent (WinHandle) = 0) and (not IsIconic (WinHandle)) and (IsWindowVisible (WinHandle)) then begin PostMessage (...
  • Выключение питания ATX коpпуса из-под DOS
    mov ax,5301h sub bx,bx int 15h jb stop mov ax,530eh sub bx,bx int 15h jb stop mov ax,5307h mov bx,0001h mov cx,0003h int 15h stop: int 20h...