gpt4 book ai didi

c - 错误 234,有更多数据可用,有 RegQueryInfoKey 和 RegEnumValue

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:23 32 4
gpt4 key购买 nike

我正在尝试使用 RegQueryInfoKey 获取最长值和数据大小,然后使用 RegEnumValue 显示所有值,但我得到的是 234 错误值,这意味着当我运行该应用程序时“有更多数据可用”。

我还使用 malloc 分配 lpValueNamelpData 所以我可以使用 RegQueryInfoKey 给出的大小我。

如果我将 lpcchValueName 设置为 16383,例如,该应用程序工作正常,但不知道为什么它不使用 返回的 lpcMaxSubKeyLen 值>RegQueryInfoKey.

注册表项有两个字符串值: HKCU\WinSide string values

我做错了什么?为您可能看到的所有新手错误道歉。这是我的代码:

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;

}

这是我的结果:

Result

非常感谢!

最佳答案

您的代码包含很多错误。

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) 并且您必须准备好,在您枚举 key 之前,有人可以更改 key 数据/值 - 因此最大值可以增加 - 您在调用 RegQueryInfoKey 时得到的只是合理的提示,而不是 100 %保证

关于c - 错误 234,有更多数据可用,有 RegQueryInfoKey 和 RegEnumValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111074/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com