2011-12-23 100 views
2

我想获取特定键路径下的所有注册表值,但RegEnumValue()始终返回错误代码259,因为ERROR_NO_MORE_ITEMS和sectionValue具有无意义的值。我手动检查注册表,并在指定的键下有值。C++ RegEnumValue() - 无法迭代到每个值

例如。
关键是MyTestApp

键值ManualTestCase = 10

键值AutomationTestCase = 50

HKEY hKey;  //registry key handle 
    LONG lResult; //result of registry operations 
    DWORD dwType, dwSize=0; 

    //try to open the key that we are currently pointing at with rootPath 
    lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, rootPath, NULL, KEY_ALL_ACCESS, &hKey); 

    if (lResult == ERROR_SUCCESS) 
    { 
     LPTSTR className = NULL; 
     DWORD classNameSize = MAX_PATH; 
     DWORD subKey = 0; 
     DWORD maxSubKey; 
     DWORD maxClass; 
     DWORD value; 
     DWORD maxValue; 
     DWORD maxValueData; 
     DWORD securityDescriptor; 
     FILETIME ftLastWriteTime; 
     DWORD sectionNameSize; 
     int j; 

     //to get total keys for the specified path 
     lResult = RegQueryInfoKey(hKey, className, &classNameSize, NULL, 
            &subKey, &maxSubKey, &maxClass, &value, &maxValue, 
            &maxValueData, &securityDescriptor, &ftLastWriteTime); 

     if(lResult == ERROR_SUCCESS) 
     { 
      for(int i = 0; i < subKey; i++) 
      {     
       LPTSTR sectionName = new TCHAR[1096]; 
       sectionNameSize = 1096; 
       ftLastWriteTime.dwHighDateTime = 0; 
       ftLastWriteTime.dwLowDateTime = 0; 

       //enumerate all the registry key names for specified path 
       lResult = RegEnumKeyEx(hKey, i, sectionName, 
           &sectionNameSize, NULL, NULL, 
           NULL, &ftLastWriteTime); 

       CString testStr = sectionName; 
       if(lResult == ERROR_SUCCESS) 
       { 
        j = 0; 
        do 
        { 
         LPTSTR sectionValue; 
         DWORD sectionValueSize = 4096; 
         DWORD dwType; 

         //enumerate all the values for specified key 
         lResult = RegEnumValue(hKey, j, sectionName, 
                &sectionNameSize, NULL, &dwType, 
                (LPBYTE)sectionValue, &sectionValueSize); 

         // 
         if(lResult == ERROR_SUCCESS) 
         { 
          //do something to the data 
          bool whatever = true;        
         } 
         else if(lResult == ERROR_MORE_DATA) 
         { 
          // 
          bool yeahSure = true; 
         } 
         j++; 

        }while(lResult != ERROR_NO_MORE_ITEMS); 
       } 

       delete[] sectionName; 
      } 
     } 
    } 

    RegCloseKey(hKey); 

回答

1

我的猜测是你的问题是你如何使用lResult = RegEnumKeyEx(hKey, i, sectionName,...

您正在尝试枚举子键的值而不实际打开该子键。

+0

谢谢,就是这样。在调用RegEnumValue(..)之前调用RegOpenKeyEx(HKEY_LOCAL_MACHINE,rootPath +“\\”+ sectionName,NULL,KEY_ALL_ACCESS,&hKey);)之后,可以得到正确的值 – Lufia 2011-12-23 21:29:59

+0

另外我需要创建KHEY变量hKey1并传入RegEnumValue()引用RegOpenKeyEx(,,,,,&hKey1)。完成遍历该值后,必须关闭hKey1,否则我无法进入下一个子键。 – Lufia 2011-12-23 21:42:56

+0

您也忘记在值枚举循环中重新初始化sectionNameSize。 – 2011-12-24 14:21:15