.:: Категории каталога ::. |
Разное
[5]
Различные темы по программированию
|
Пакет SWT
[4]
Практикуемся в написании оконных приложений на Java
|
Среды разработки, компиляторы и т.п
[3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
|
Java
[8]
Объектно-ориентированные соображения.
|
Си++
[19]
Коротко и ясно
|
Ассемблер
[6]
Машинные коды, побитно :)
|
|
|
.:: Коментируем ::. |
 |
Работа с реестром
Перед тем, как начать, хочу предупредить, что бездумная работа с реестром (даже начинающих программистов) может привести к краху системы. (ну, пару раз было как-то :)) Оригинальный пример: Code #include <windows.h> #include <stdio.h> #include <tchar.h>
#define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 void QueryKey(HKEY hKey) { TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name DWORD cbName; // size of name string TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys=0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD i, retCode; TCHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; // Get the class name and the value count. retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time // Enumerate the subkeys, until RegEnumKeyEx fails. if (cSubKeys) { printf( "\nNumber of subkeys: %d\n", cSubKeys);
for (i=0; i<cSubKeys; i++) { cbName = MAX_KEY_LENGTH; retCode = RegEnumKeyEx(hKey, i, achKey, &cbName, NULL, NULL, NULL, &ftLastWriteTime); if (retCode == ERROR_SUCCESS) { _tprintf(TEXT("(%d) %s\n"), i+1, achKey); } } } // Enumerate the key values.
if (cValues) { printf( "\nNumber of values: %d\n", cValues);
for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) { cchValue = MAX_VALUE_NAME; achValue[0] = '\0'; retCode = RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL); if (retCode == ERROR_SUCCESS ) { _tprintf(TEXT("(%d) %s\n"), i+1, achValue); } } } }
void _tmain(void) { HKEY hTestKey;
if( RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft"), 0, KEY_READ, &hTestKey) == ERROR_SUCCESS ) { QueryKey(hTestKey); } RegCloseKey(hTestKey); } Модифицированный: Code #include <windows.h> #include <iostream>
#define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 void QueryKey(HKEY hKey) { TCHAR achKey[MAX_KEY_LENGTH]; // буфер для имён подключей DWORD cbName; // размер строки имени TCHAR achClass[MAX_PATH] = TEXT(""); // буфер для имени класса DWORD cchClassName = MAX_PATH; // размер строки класса DWORD cSubKeys=0; // число подключей DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // число значений ключа DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD i, retCode; TCHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; // Get the class name and the value count. retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time // Enumerate the subkeys, until RegEnumKeyEx fails. if (cSubKeys) { std::wcout << std::endl << L"Число подключей: " << cSubKeys << std::endl;
for (i=0; i<cSubKeys; i++) { cbName = MAX_KEY_LENGTH; retCode = RegEnumKeyEx(hKey, i, achKey, &cbName, NULL, NULL, NULL, &ftLastWriteTime); if (retCode == ERROR_SUCCESS) { std::wcout << "(" << i+1 << ") " << achKey << std::endl; } } } // Enumerate the key values. if (cValues) { std::wcout << std::endl << L"Число значений: " << cValues << std::endl;
for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) { cchValue = MAX_VALUE_NAME; achValue[0] = '\0'; retCode = RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL); if (retCode == ERROR_SUCCESS ) { std::wcout << "(" << i+1 << ") " << achValue <<std::endl; //_tprintf(TEXT("(%d) %s\n"), i+1, achValue); } } } }
void main (void) { std::wcout.imbue(std::locale("Russian_russia.OCP")); HKEY hTestKey;
if (RegOpenKeyEx (HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft",0,KEY_READ,&hTestKey) == ERROR_SUCCESS) { QueryKey (hTestKey); } RegCloseKey (hTestKey); system ("pause"); } Модификация не глобальная. Во-первых программа стала "говорить" по русски. Вывод _tprintf заменил на C++ метод wcout прастранства имён STD и добавил ожидание нажатия клавиши в конце программы. Из-за этого меняем #include<stdio.h> и #include<tchar.h> на #include<iostream> В настройках проекта (создан на Visual Studio 2008), Character Set = Use Unicode Charcter Set, кстати программа изначально использует Unicode для вывода. Напомню, что символ L ставится перед строкой для преобразования её к Unicode виду. Удачных экспериментов.
|
Категория: Си++ | Добавил: C0demaker (21.04.2009)
|
Просмотров: 1506
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
|