错误 234,有更多数据可用,有 RegQueryInfoKey 和 RegEnumValue
Error 234, more data is available, with RegQueryInfoKey and RegEnumValue
我正在尝试使用 RegQueryInfoKey
获取最长值和数据大小,然后使用 RegEnumValue
显示所有值,但我得到 234 错误值,这意味着 "More data is available" 当我 运行 应用程序时。
我还使用 malloc
分配 lpValueName
和 lpData
,因此我可以使用 RegQueryInfoKey
给我的大小。
如果我将 lpcchValueName
设置为 16383,例如,该应用程序工作正常,但不知道为什么它不使用 RegQueryInfoKey
返回的 lpcMaxSubKeyLen
值。
注册表项有两个字符串值:
我做错了什么?为您可能看到的所有新手错误道歉。这是我的代码:
int wmain()
{
//RegOpenKeyEx
HKEY hKey = HKEY_CURRENT_USER;
LPCWSTR subKey = L"WinSide";
DWORD options = 0;
REGSAM samDesired = KEY_QUERY_VALUE;
HKEY hkOpenResult;
//Opening the HKEY_CURRENT_USER\WinSide subkey
LONG openKey = RegOpenKeyEx(hKey, subKey, options,
samDesired, &hkOpenResult);
if (openKey != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", openKey);
else
{
wprintf(L"Key opened!\n");
//RegQueryInfoKey
LPWSTR pClass = NULL;
LPDWORD pcClass = NULL;
LPDWORD reserved = NULL;
DWORD numberOfSubKeys;
LPDWORD pcMaxSubKeyLen = NULL;
LPDWORD pcMaxClassLen = NULL;
DWORD numberOfValues;
DWORD longestValueName;
DWORD longestDataComponent;
LPDWORD securityDescriptor = NULL;
PFILETIME pLastWriteTime = NULL;
//Querying info from HKCU\WinSide subkey
LONG queryInfo = RegQueryInfoKey(hkOpenResult, pClass, pcClass, reserved, &numberOfSubKeys,
pcMaxSubKeyLen, pcMaxClassLen, &numberOfValues,
&longestValueName, &longestDataComponent,
securityDescriptor, pLastWriteTime);
if (queryInfo != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", queryInfo);
else
{
wprintf(L"Key queried!\n");
wprintf(L"Number of values: %u\n", numberOfValues);
//RegEnumValue
DWORD index=0;
DWORD sizedem = sizeof(WCHAR);
LPWSTR nameOfValue = (LPWSTR)malloc(longestValueName * sizeof(WCHAR));
DWORD sizeOfBufffer = longestValueName;
DWORD typeOfDataStored;
LPBYTE pData = (LPBYTE)malloc(longestDataComponent * sizeof(BYTE));
DWORD sizeOfData = longestDataComponent;
if (nameOfValue != NULL && pData != NULL)
{
for (index = 0; index < numberOfValues; index++)
{
sizeOfBufffer = longestValueName;
//Enumerating values from HKCU\WinSide subkey
LONG enuValue = RegEnumValue(hkOpenResult, index, nameOfValue,
&sizeOfBufffer, NULL, &typeOfDataStored,
pData, &sizeOfData);
if (enuValue != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", enuValue);
else
{
wprintf(L"Value: %s\n", (LPWSTR)pData);
}
}
}
else
{
wprintf(L"Memory could not be allocated.\n");
}
free(nameOfValue);
free(pData);
}
RegCloseKey(hkOpenResult);
}
return 0;
}
这是我的结果:
非常感谢!
您的代码包含很多错误。
1)
LPWSTR nameOfValue = (LPWSTR)malloc(longestValueName * sizeof(WCHAR));
真的是 longestValueName 这是
The size does not include the terminating null character.
所以你需要
LPWSTR nameOfValue = (LPWSTR)malloc((longestValueName + 1) * sizeof(WCHAR));
或(更好)
LPWSTR nameOfValue = (LPWSTR)malloc(++longestValueName * sizeof(WCHAR));
然后在循环中,如果使用第一个变体 - sizeOfBufffer = longestValueName + 1
;
或者如您的代码所示,如果使用 ++longestValueName
2) DWORD sizeOfData = longestDataComponent;
您必须在循环中执行此操作,因为 sizeOfBufffer = longestValueName
;因为 sizeOfData
会在每 RegEnumValue
之后改变
3) 并且您必须准备好,在您枚举密钥之前,有人可以更改密钥 data/values - 因此最大值可以增加 - 您在电话 RegQueryInfoKey
中得到的只是合理的提示,但不是100% 保证
我正在尝试使用 RegQueryInfoKey
获取最长值和数据大小,然后使用 RegEnumValue
显示所有值,但我得到 234 错误值,这意味着 "More data is available" 当我 运行 应用程序时。
我还使用 malloc
分配 lpValueName
和 lpData
,因此我可以使用 RegQueryInfoKey
给我的大小。
如果我将 lpcchValueName
设置为 16383,例如,该应用程序工作正常,但不知道为什么它不使用 RegQueryInfoKey
返回的 lpcMaxSubKeyLen
值。
注册表项有两个字符串值:
我做错了什么?为您可能看到的所有新手错误道歉。这是我的代码:
int wmain()
{
//RegOpenKeyEx
HKEY hKey = HKEY_CURRENT_USER;
LPCWSTR subKey = L"WinSide";
DWORD options = 0;
REGSAM samDesired = KEY_QUERY_VALUE;
HKEY hkOpenResult;
//Opening the HKEY_CURRENT_USER\WinSide subkey
LONG openKey = RegOpenKeyEx(hKey, subKey, options,
samDesired, &hkOpenResult);
if (openKey != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", openKey);
else
{
wprintf(L"Key opened!\n");
//RegQueryInfoKey
LPWSTR pClass = NULL;
LPDWORD pcClass = NULL;
LPDWORD reserved = NULL;
DWORD numberOfSubKeys;
LPDWORD pcMaxSubKeyLen = NULL;
LPDWORD pcMaxClassLen = NULL;
DWORD numberOfValues;
DWORD longestValueName;
DWORD longestDataComponent;
LPDWORD securityDescriptor = NULL;
PFILETIME pLastWriteTime = NULL;
//Querying info from HKCU\WinSide subkey
LONG queryInfo = RegQueryInfoKey(hkOpenResult, pClass, pcClass, reserved, &numberOfSubKeys,
pcMaxSubKeyLen, pcMaxClassLen, &numberOfValues,
&longestValueName, &longestDataComponent,
securityDescriptor, pLastWriteTime);
if (queryInfo != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", queryInfo);
else
{
wprintf(L"Key queried!\n");
wprintf(L"Number of values: %u\n", numberOfValues);
//RegEnumValue
DWORD index=0;
DWORD sizedem = sizeof(WCHAR);
LPWSTR nameOfValue = (LPWSTR)malloc(longestValueName * sizeof(WCHAR));
DWORD sizeOfBufffer = longestValueName;
DWORD typeOfDataStored;
LPBYTE pData = (LPBYTE)malloc(longestDataComponent * sizeof(BYTE));
DWORD sizeOfData = longestDataComponent;
if (nameOfValue != NULL && pData != NULL)
{
for (index = 0; index < numberOfValues; index++)
{
sizeOfBufffer = longestValueName;
//Enumerating values from HKCU\WinSide subkey
LONG enuValue = RegEnumValue(hkOpenResult, index, nameOfValue,
&sizeOfBufffer, NULL, &typeOfDataStored,
pData, &sizeOfData);
if (enuValue != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", enuValue);
else
{
wprintf(L"Value: %s\n", (LPWSTR)pData);
}
}
}
else
{
wprintf(L"Memory could not be allocated.\n");
}
free(nameOfValue);
free(pData);
}
RegCloseKey(hkOpenResult);
}
return 0;
}
这是我的结果:
非常感谢!
您的代码包含很多错误。
1)
LPWSTR nameOfValue = (LPWSTR)malloc(longestValueName * sizeof(WCHAR));
真的是 longestValueName 这是
The size does not include the terminating null character.
所以你需要
LPWSTR nameOfValue = (LPWSTR)malloc((longestValueName + 1) * sizeof(WCHAR));
或(更好)
LPWSTR nameOfValue = (LPWSTR)malloc(++longestValueName * sizeof(WCHAR));
然后在循环中,如果使用第一个变体 - sizeOfBufffer = longestValueName + 1
;
或者如您的代码所示,如果使用 ++longestValueName
2) DWORD sizeOfData = longestDataComponent;
您必须在循环中执行此操作,因为 sizeOfBufffer = longestValueName
;因为 sizeOfData
会在每 RegEnumValue
3) 并且您必须准备好,在您枚举密钥之前,有人可以更改密钥 data/values - 因此最大值可以增加 - 您在电话 RegQueryInfoKey
中得到的只是合理的提示,但不是100% 保证