Создать класс для работы с реестром. Поля класса – корневой раздел,
описатель ключа, тип доступа, значение возвращенное функциями Windows
API после последней операции с ключом. Класс включает: конструктор с
параметром – открытие ключа с именем, переданным в качестве параметра
(если его нет – ключ должен быть создан), методы, чтения, записи значений
ключа. Деструктор осуществляет закрытие ключа без его удаления. Написать
программу-пример с использованием созданного класса.
Программа запускается, но не работает должным образом, а именно:
не записывает данные в реестр;
не выводит значения ключа, а выводит только их число.
файл *.h:
Код:
class KEYOPERATIONS
{
HKEY hKey;//корневой раздел
::PHKEY phkResult;//описатель ключа
REGSAM samDesired;//тип доступа
CHAR *cBuf;//значения ключа
public:
KEYOPERATIONS(HKEY hKey);//конструктор с параметром, принимающий в кач-ве параметра имя ключа
~KEYOPERATIONS();
void QueryKey(HKEY hKey);//метод, осуществляющий чтение значений
void WriteKey(HKEY hKey, LONG lRet, char *s);//метод, осуществляющий запись значений
};
файл с описанием конструктора, деструктора и методов класса *.cpp:
Код:
#include <vcl.h>
#include <windows.h>
#include <conio.h>
#include <iostream.h>
#include "Class.h"
#pragma hdrstop
#include <string.h>
#include <stdio.h>
#define MAX_VALUE_NAME 16383
//--------------
KEYOPERATIONS::KEYOPERATIONS(HKEY hKey)
{
LONG lRet = 0;
lRet = RegCreateKeyEx(HKEY_CURRENT_USER, "MyKey", 0, "", 0,
KEY_READ | KEY_WRITE, NULL, &hKey, NULL);
};
KEYOPERATIONS::~KEYOPERATIONS()
{
RegCloseKey( hKey );
};
void KEYOPERATIONS::WriteKey(HKEY hKey, LONG lRet, char *s)
{
CHAR buf[MAX_PATH] = {0};
if (hKey)
{
strcpy(buf, s);
lRet = RegSetValueEx(hKey, "MyValue", 0, REG_SZ,
(LPBYTE)&buf, strlen(buf));
if (lRet != ERROR_SUCCESS)
printf("Error writing value to registry");
else
printf("Data '%s' is written to registry", buf);
};
};
void KEYOPERATIONS::QueryKey(HKEY hKey)
{
TCHAR achKey[MAX_PATH] = {0}; // буфер для имени ключа
DWORD cValues; // количество значений ключа
DWORD i, retCode;
DWORD cchValue = MAX_VALUE_NAME ;
TCHAR tmp[MAX_PATH] = {0}; //буфер под имя значения
//получаем количество значений ключа
retCode = RegQueryInfoKey(
hKey, NULL, NULL, NULL, NULL, NULL,
NULL, &cValues, NULL, NULL, NULL, NULL);
//перечисляем значения ключей
if (cValues)
{
printf("\nNumber of values: %d\n", cValues);
for (i = 0, retCode = ERROR_SUCCESS; i < cValues; i++)
{
cchValue = MAX_VALUE_NAME;
achKey[0] = '\0';
DWORD dwType;
DWORD dwReturnLength = MAX_PATH;
retCode = RegEnumValue(hKey,
i,
achKey,
&cchValue,
NULL,
NULL,
NULL,
NULL);
if (retCode == ERROR_SUCCESS)
{
//узнаем тип данных значения ключа
retCode = RegQueryValueEx(hKey,
achKey,
NULL,
&dwType,
NULL,
NULL);
//если строка, тогда читаем ее и выводим на экран
if ((retCode == ERROR_SUCCESS) && (dwType == REG_SZ))
{
cchValue = MAX_VALUE_NAME;
retCode = RegEnumValue(hKey,
i, achKey, &cchValue, NULL, &dwType,
(LPBYTE)&tmp,
&dwReturnLength);
if (retCode == ERROR_SUCCESS)
printf("%s = %s\n", achKey, tmp);
}
}
}
}
}
файл с главной функцией:
Код:
//-------------------------
#include <vcl.h>
#include <windows.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <clx.h>
#pragma hdrstop
#include "Class.h"
//-------------------
#pragma argsused
void rus(char*a)
{
char*b=new char [strlen(a)+1];
CharToOem (a,b);
cout<<b;
delete[]b;
}
int main(int argc, char* argv[])
{ int a,b,c;
char stroka[256];
HKEY hKey = NULL;
LONG lRet = 0;
KEYOPERATIONS pysh(hKey);
do
{
clrscr();
rus("Меню: ");
cout<<endl;
rus("1 - добавить запись в реестр ");
cout<<endl;
rus("2 - показать записи в реестре ");
cout<<endl;
rus("0 - выход ");
cout<<endl;
cin>>c;
switch(c)
{
case 1:
rus("Ввод: ");
scanf("%s",&stroka);
pysh.WriteKey( hKey, lRet, stroka);
break;
case 2:
pysh.QueryKey( hKey);
getch();
break;
case 0:
break;
default:
rus("Неизвестная команда ");
getch();
}
}
while(c!=0);
return 0;
}