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

Error 234, more data is available, with RegQueryInfoKey and RegEnumValue

我正在尝试使用 RegQueryInfoKey 获取最长值和数据大小,然后使用 RegEnumValue 显示所有值,但我得到 234 错误值,这意味着 "More data is available" 当我 运行 应用程序时。

我还使用 malloc 分配 lpValueNamelpData,因此我可以使用 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% 保证