Работа с реестром на с++

Serega325
Дата: 01.05.2015 09:15:57
Здравствуйте,помогите пожалуйста. Мне нужно пройтись по веткам реестра и прочитать значение параметра в каждой ветке. Имя ветки я получаю функцией RegEnumKeyEx, параметр RegQueryValueEx, но в моём коде функция RegQueryValueEx возвращает значение кодом 2 -не удаётся найти указанный раздел. Почему она его не находит ?

#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
    HKEY rKey;
    HKEY rKey2;
    _TCHAR Reget[255]={'\0'};
    TCHAR achKey[MAX_PATH];
    DWORD i, retCode, maxlen = MAX_PATH;
    DWORD RegetPath=sizeof (Reget);
    LONG res;
   LONG res2;
   FILETIME ftLastWriteTime;
   if ((res = RegOpenKeyExW(HKEY_LOCAL_MACHINE,L" SOFTWARE\\Microsoft\\Windows\\Curre ntVersion\\Uninstall",NULL,KEY_ENUM      
                                                                      ERATE_SUB_KEYS | KEY_WOW64_64KEY | KEY_READ, &rKey))==ERROR_SUCCESS)
    {
           for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS;i++)
            {
                retCode = RegEnumKeyEx(rKey, i,achKey, &maxlen, NULL, NULL,NULL, &ftLastWriteTime);
                maxlen = MAX_PATH;
                if (retCode == ERROR_SUCCESS)
                {
                        if ((res2 = RegQueryValueEx(rKey,L"Publisher", NULL,0,(LPBYTE)Reget,&RegetPath))== ERROR_SUCCESS)
                       {
                            wprintf(L"%s\n",Reget);
                       }
                      else {printf("res2 = %d\n",res2);}
                }
                 else {printf("retCode = %d\n",retCode);}
            }
            RegCloseKey(rKey);
     }
    else{wprintf(L"res = %d\n",res);}
    getchar();
    return 0;
}
bazile
Дата: 01.05.2015 09:41:43
Serega325, по моему ты пытаешься прочитать значение Publisher внутри ключа Uninstall, а не вложенного ключа как ты хотел. Открой ключ который тебе вернул RegEnumKeyEx и читай из него.
Serega325
Дата: 01.05.2015 11:03:39
Открой ключ который тебе вернул RegEnumKeyEx и читай из него.[/quot]

В общем сдел так и всё получилось.
if((RegOpenKeyExW(rKey,achKey,NULL,KEY_WOW64_64KEY | KEY_QUERY_VALUE, &rKey2))==ERROR_SUCCESS)
						{
							if ((res2 = RegQueryValueEx(rKey2,L"Publisher", NULL,0,
                                                                                                                          LPBYTE)Reget,&RegetPath))==ERROR_SUCCESS)
							{
							   wprintf(L"Reget = %s\n",Reget);
							}
							else {printf("res2 = %d\n",res2);}					
						}
						else {printf("RegOpenKeyExW error");}


Я думал, что RegEnumKeyEx возвращает ключ rKey+achKey.
bazile
Дата: 01.05.2015 11:15:24