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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2012, 22:19   #1
gagarin0
Пользователь
 
Регистрация: 01.10.2010
Сообщений: 24
По умолчанию RegEnumValue не находит значения в HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows\CurrentVersion\Run

Здравствуйте, форумчане!
Хочу написать программку, чтобы читала значения регистров из HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows\CurrentVersion\Run.
Вот код, которым пытаюсь это сделать:
Код:
int _tmain(int argc, _TCHAR* argv[])
{
	HKEY rKey;
	char Reget[512] = {0};
	DWORD RegetPath = sizeof(Reget);
	DWORD dwType = 0;
	dwType = REG_SZ;
	DWORD dwRet = 10000, dwRetOp;
	 
    dwRetOp = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
			TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 
			0, 
			KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE, 
			&rKey);
   
	if (dwRetOp != ERROR_SUCCESS)
		std::cout << "\nCant open register, error: " << dwRetOp ;
  
  
    DWORD dwValueCount;         
    DWORD dwMaxNameLen;         
    DWORD dwMaxValueData;       
    ::RegQueryInfoKey(rKey,NULL, NULL, NULL,NULL,NULL, NULL, 
        &dwValueCount, &dwMaxNameLen, &dwMaxValueData, NULL, NULL);
	std::cout << "\n Count values: " << dwValueCount << " with max lenght: "<< dwMaxNameLen << std::endl;
   

    TCHAR ValueName[256];
    BYTE g_ValueDataBuffer[16L*1024L*sizeof(TCHAR)];
    DWORD cbValueName;
    DWORD cbValueData;
    DWORD EnumIndex = 0;
    DWORD Type;
	while (TRUE) {

		cbValueName = sizeof(ValueName);
		cbValueData = sizeof(g_ValueDataBuffer);

		DWORD dwRetEnum = RegEnumValue(rKey, EnumIndex++,
                ValueName, &cbValueName, NULL, &Type, g_ValueDataBuffer,
                &cbValueData);
		if (dwRetEnum != ERROR_SUCCESS)
		{	
			std::cout << "\nRegEnumValue error, error:" << dwRetEnum;
			break;
		}

		dwRet = RegQueryValueEx(rKey, 
						(LPTSTR )ValueName
						,NULL, &dwType, (LPBYTE)Reget, &RegetPath);
	
		if( dwRet == ERROR_SUCCESS)
		{
			std::cout << "\nkey value is '" << Reget << "'\n";
		}
		else
		{
			if (dwRet == ERROR_MORE_DATA)
			{
				std::cout <<  "\nbuffer that is big enough\n";
			}
			else
				std::cout << "\ncan not query for key value, error:" << dwRet;
		}
	}
	RegCloseKey(rKey);
	
	std::cout << "\nHKEY_LOCAL_MACHINE Run registry: " << Reget << std::endl;

	std::cin.get();

	return 0;
}
Но оно не находит значения ключей в этой ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows\CurrentVersion\Run. Хотя в других ветках, в том числе HKEY_CURRENT_USER\SOFTWARE\Microsof t\Windows\CurrentVersion\Run все находит.
Я смотрел regedit.exe там значения есть. Там у меня НОД32 прописан. Я думал, может это антивир как-то скрывает свое значение регистра. Создал свое значение, оно его тоже не видит. Хотя regedit.exe и еще одна программка видит, мной созданное, значение.
Я скачал исходники regedit.exe, просмотрел их, вроде, я сделал все как там. Но он видит эти значения, а моя программа нет!!! В чем может быть проблема, подскажите пожалуйста!! Может дело в каких-то правах доступа?? Дело в том, что даже RegQueryInfoKey() пишет, что число значений равно 0... Я в растеряности...

Последний раз редактировалось gagarin0; 16.01.2012 в 00:01.
gagarin0 вне форума Ответить с цитированием
Старый 15.01.2012, 22:30   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может быть дело в том что вы открываете HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows\CurrentVersion\RunOnce?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.01.2012, 00:01   #3
gagarin0
Пользователь
 
Регистрация: 01.10.2010
Сообщений: 24
По умолчанию

Нет... Сорри, это я пробовал разные варианты... видимо осталось... я исправил тему..
gagarin0 вне форума Ответить с цитированием
Старый 17.01.2012, 00:46   #4
gagarin0
Пользователь
 
Регистрация: 01.10.2010
Сообщений: 24
По умолчанию

Решение нашел... тему можно закрывать.
Если кому интересно:
Оказывается все дело было в том, что у меня 64-битная машина. При этом на 64-битных Windows, часть записей в реестре хранятся отдельно для 32-разрядных приложений и 64-разрядных приложений и отображаются в отдельном логического представление реестра с помощью registry redirector и registry reflection:
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
Поэтому мой запрос на HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows\CurrentVersion\Run оно автоматически перенаправляло на HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432 Node\Microsoft\Windows\CurrentVersi on\Run. Там у меня не было никаких записей, поэтому RegQueryInfoKey() и RegEnumValue() ничего и не находили.
Поэтому, для просмотра обоих регистров можно использовать флаги доступа KEY_WOW64_64KEY и KEY_WOW64_32KEY при открытии регистра:
Код:
RegOpenKeyEx(hKeyParent, KeyName, 0, KEY_READ | KEY_WOW64_64KEY,  &hKey);
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Можно использовать еще такую конструкцию:
Код:
#if defined(_WIN64)

#define CROSS_ACCESS KEY_WOW64_32KEY

#else

#define CROSS_ACCESS KEY_WOW64_64KEY

...

RegOpenKeyEx(hKeyParent, KeyName, 0, KEY_READ | CROSS_ACCESS,  &hKey);
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
gagarin0 вне форума Ответить с цитированием
Старый 17.01.2012, 00:50   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Оказывается все дело было в том, что у меня 64-битная машина.
на будущее стоит уточнять ОС.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа, которая находит в массиве значения, повторяющиеся два и более раз yugik Общие вопросы C/C++ 6 08.03.2013 18:14
записываю значение в regedit а файл C:\Windows\System32\config\software не меняется goluzov Win Api 4 26.11.2011 16:08
Написать программу, которая находит в массиве значения, повторяющиеся два и более раз, и показывает их на экран -KAZtrel- Помощь студентам 1 18.11.2011 23:25
Написать программу, которая находит в массиве значения, повторяющиеся два и более раз, и показывает их на экран -KAZtrel- Помощь студентам 2 18.11.2011 22:29
Windows7,не работает HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows NT\CurrentVersion\Windows\AppInit_D LLs ассемблер123 Windows 0 22.04.2010 18:30