Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Путаница с реестром


Автор: scroollocker 27.6.2013, 11:24
Всем привет!

Столкнулся с проблемой, связанной с реестром Windows x64.

У меня есть файл реестра akk.reg:
Код

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\My Soft]
"Str1" = "Assa"
"Str2" = "142Z5214GGAAVGA"


Я добавляю этот код в реестр, запусканием файла. Теперь мне нужно его считать из реестра. Открываю с помощью:

Код

RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\My Soft", 0,NULL,0,    KEY_READ | KEY_WOW64_64KEY,NULL,&hKey,&dwDis))
/*
читаю значения с помощью RegQueryValueEx... 
*/



На 32битной Windows все работает, на 64 не хочет читать данные. Возникает вопрос, как мне прочитать данные, которые занесены в реестр с помощью reg-файла? Где они хранятся? в 32битной ветке, или в 64... В общем путаница у меня  smile  smile 

Автор: DarthTon 27.6.2013, 12:07
Полагаю что-то не так с вашим вызовом RegQueryValueEx, т.к. у меня всё работает. При использовании reg файла через контекстное меню, запись по-умолчанию добавляется в 64-битную ветку.

Код

DWORD dwDis       = 0;
HKEY hKey         = NULL;
wchar_t data[255] = {0};
DWORD size        = sizeof(data);
LRESULT lres      = 0;

lres = RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\My Soft"), 0, NULL, 0, KEY_READ | KEY_WOW64_64KEY, NULL, &hKey, &dwDis);
lres = RegQueryValueEx(hKey, _T("Str2"), NULL, NULL, (LPBYTE)data, &size);

Автор: scroollocker 27.6.2013, 12:19
Компилирую программку в 32 винде.

Использую грубо такой код:

Код

char *pVal = new char[256];
memset(pVal,0,256);
DWORD dwSize = 255;
DWORD dwType = REG_SZ;

RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\My Soft", 0,NULL,0, KEY_READ | KEY_WOW64_64KEY,NULL,&hKey,&dwDis));

RegQueryValueEx(hKey, "Str2", 0, &dwType, (unsigned char*)pVal, &dwSize);



Пробовал делать 

Код

RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\My Soft", 0,NULL,0, KEY_READ | KEY_WOW64_32KEY,NULL,&hKey,&dwDis));


Использовать вместо KEY_READ - KEY_ALL_ACCESS... А какое значение прописано в KEY_WOW64_64KEY? может еще дело в нем

Автор: DarthTon 27.6.2013, 12:39
Строки в реестре хранятся в юникоде, используйте wchar_t для получения строковых данных. 
А вообще, что конкретно не работает? Что возвращает функция RegQueryValueEx?

Автор: scroollocker 28.6.2013, 21:18
Все решилось заменой RegCreateKeyEx на RegOpenKeyEx. Сразу все прочитало, все заработало. Как я понял, он создавал ключ в ветке реестра для 32 битных программ и оттуда читал, хоть и стоял флаг KEY_WOW64_64KEY, а там пусто. Хотя может я неправильно и понял  smile 

DarthTon
Спасибо вам, за надежду, что код у вас заработал. =) Без этой надежды не стал бы эксперементировать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)