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,
§ionNameSize, 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,
§ionNameSize, NULL, &dwType,
(LPBYTE)sectionValue, §ionValueSize);
//
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);
谢谢,就是这样。在调用RegEnumValue(..)之前调用RegOpenKeyEx(HKEY_LOCAL_MACHINE,rootPath +“\\”+ sectionName,NULL,KEY_ALL_ACCESS,&hKey);)之后,可以得到正确的值 – Lufia 2011-12-23 21:29:59
另外我需要创建KHEY变量hKey1并传入RegEnumValue()引用RegOpenKeyEx(,,,,,&hKey1)。完成遍历该值后,必须关闭hKey1,否则我无法进入下一个子键。 – Lufia 2011-12-23 21:42:56
您也忘记在值枚举循环中重新初始化sectionNameSize。 – 2011-12-24 14:21:15