Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Слушай, дружище, зачем так мучиться с этим языком С++, ты ведь не Билл Гейтс. Возьми тот же Python и программируй, он кроссплатформенный, под Windows тоже работает. Я сам давно заметил: то что на Си пишешь в страницу кода, на питоне решается в одну-две строки. При том, питон намного проще, я его сам недавно изучил по видеокурсу вот этому. Кстати, автор отлично там объясняет. Буквально день-два и уже будешь писать на нём, чего не скажешь про сложный С++.
Работа с подключами в реестре

Следующий пример демонстрирует использование функций 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));
 
 }


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS