Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2011, 16:37   #1
Dead Romantic
Пользователь
 
Регистрация: 02.12.2009
Сообщений: 32
По умолчанию С++. Создание класса для работы с реестром Windows

Создать класс для работы с реестром. Поля класса – корневой раздел,
описатель ключа, тип доступа, значение возвращенное функциями 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;

}
Dead Romantic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание отдельного модуля для класса... Mixim C++ Builder 2 24.04.2010 11:27
Посоветуйте прогу для работы с реестром Денис Коржанов Софт 4 28.01.2009 11:17
Правильная организация класса для работы с таблицей mysql Choo PHP 10 08.08.2008 08:55