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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2013, 22:52   #1
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию [C] Чтение подключей реестра

Всем привет!
Возникла ошибка(если так можно сказать) с чтением подключей реестра, вот код:
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

void printColor(char* text, int color)
{
    HANDLE hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
    printf("%s",text);
    SetConsoleTextAttribute(hConsole, 7);
}

int main(void)
{
	printColor("Notice, that key will search in HKEY_CURRENT_USER\n", 11);
	printf("Example: Software\\Adobe\n\n");
	char key[100];
	printf("Enter key: ");
	scanf_s("%s", &key);

	HKEY keyOpen;
	DWORD lResult = RegOpenKeyExA(HKEY_CURRENT_USER, key, NULL, KEY_ENUMERATE_SUB_KEYS, &keyOpen);
	if( lResult == ERROR_SUCCESS)
	{
		printColor("Success", 2);printf(" open key %s.\n", key);
		char buffer[255];
		DWORD i, dwSize, retCode, maxlen = MAX_PATH;
		FILETIME ftLastWriteTime;
		retCode = RegEnumKeyExA(keyOpen, NULL, buffer, &dwSize, NULL, NULL, NULL, &ftLastWriteTime);
		for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++)
		{
			retCode = RegEnumKeyExA(keyOpen, i, buffer, &maxlen, NULL, NULL, NULL, &ftLastWriteTime);
			maxlen = MAX_PATH;
			if (retCode == ERROR_SUCCESS)
				   printf("Key: %s\n", buffer);
		}
		//printf("Key: %s\n", buffer);
		RegCloseKey(keyOpen);
	}
	else if(lResult == ERROR_FILE_NOT_FOUND)
	{
		printColor("Error!", 4);printf(" Key not found.\n");
		RegCloseKey(keyOpen);
	}
	else
	{
		printColor("Error!", 4);printf(" Can't open key.\n");
		RegCloseKey(keyOpen);
	}


	printf("Press any key to exit...\n");
	_getch();
	return 0;
}
Не выводит ключи, т.е. просто пустоту выводит. В чём проблема?
hvz- вне форума Ответить с цитированием
Старый 17.01.2013, 23:27   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

На первый взгляд все верно.
Но если не выводит, значит retCode != ERROR_SUCCESS.
Чему равен retCode в соответствии с константами в Winerror.h ?
EUGY вне форума Ответить с цитированием
Старый 17.01.2013, 23:36   #3
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
На первый взгляд все верно.
Но если не выводит, значит retCode != ERROR_SUCCESS
Странно, заменил в цикле знак сравнения и выводит, но только один ключ - Classes, вбивал Software.

Цитата:
Сообщение от EUGY Посмотреть сообщение
Чему равен retCode в соответствии с константами в Winerror.h ?
Извиняюсь, но я не понял вопроса.

В принципе задача решена, нашей на msdn способ выведения подключей, подправил под себя.
Но всё равно хочу заставить работать свой вариант для понимания темы.
hvz- вне форума Ответить с цитированием
Старый 17.01.2013, 23:50   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Чего тут непонятного
RegEnumKeyEx возвращает код ошибки.
Если ошибки нет - возвращает ERROR_SUCCESS.
Если ошибка есть, возвращает что-то другое.
Вопрос - что?
retCode = RegEnumKeyExA(
Вернется какое-то число. Вот его и посмотреть в файле заголовка Winerror.h
EUGY вне форума Ответить с цитированием
Старый 18.01.2013, 00:13   #5
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Чего тут непонятного
RegEnumKeyEx возвращает код ошибки.
Если ошибки нет - возвращает ERROR_SUCCESS.
Если ошибка есть, возвращает что-то другое.
Вопрос - что?
retCode = RegEnumKeyExA(
Вернется какое-то число. Вот его и посмотреть в файле заголовка Winerror.h
Возвращает 0, до цикла и в нём.
Странно то, что цикл работает, т.е. переменную retCode он выводит какое то количество раз.
Всегда переменная = 0, кроме последнего круга цикла - 259. Код ошибки нашёл - ERROR_NO_MORE_ITEMS что и понятно из названия.
Т.е. цикл проходит по всем ключам но выводит почему то только один. А пока я писал эти строки, я понял почему только один - т.к. в цикле проверка стоит != т.е. когда код ошибки не будет 0, он выведет, и выводит в конце т.к. в конце получаем код ошибки что больше нету ключей.
Поставил проверку на == и всё заработало)

Только одного не понимаю, что я изменил что всё заработало

Последний раз редактировалось hvz-; 18.01.2013 в 00:19.
hvz- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись/чтение из реестра muham33 Помощь студентам 2 05.01.2013 22:38
чтение Реестра Robin_ Общие вопросы Delphi 1 03.09.2012 11:04
Чтение параметра из реестра nister17 C# (си шарп) 1 10.08.2012 14:09
Чтение данных из реестра TranzitZP Microsoft Office Access 2 30.12.2010 23:01
Чтение данных из реестра на WinAPI... ActiveX Win Api 2 27.06.2008 20:14