C ++ RegEnumValue() - 无法迭代到每个值

时间:2011-12-23 20:35:54

标签: c++ windows winapi registry

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

例如。
密钥是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 个答案:

答案 0 :(得分:1)

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

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