Четверг, 17.07.2025, 17:15
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
.:: Меню ::.
.:: Категории каталога ::.
Разное [5]
Различные темы по программированию
Пакет SWT [4]
Практикуемся в написании оконных приложений на Java
Среды разработки, компиляторы и т.п [3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
Java [8]
Объектно-ориентированные соображения.
Си++ [19]
Коротко и ясно
Ассемблер [6]
Машинные коды, побитно :)
Форма входа
.:: Поиск ::.
.:: Дополнительно ::.
    Хостинг от Loqo.ru
             .:: Коментируем ::.
Главная » Статьи » Текстовый материал » Си++

Работа с реестром
Перед тем, как начать, хочу предупредить, что бездумная работа с реестром (даже начинающих программистов) может привести к краху системы. (ну, пару раз было как-то :))

Оригинальный пример:

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
Всего комментариев: 0

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ant1 © 2025