我试图使用RegQueryInfoKey来获取最长值和数据大小,然后使用RegEnumValue来显示所有值,但是我得到了234个错误值,这意味着当我运行应用程序时“有更多数据可用”。
我还使用malloc来分配lpValueNamelpData以便使用RegQueryInfoKey给我的大小。
例如,如果我将lpcchValueName设置为16383,这个应用程序运行得很好,但它不知道为什么它没有使用lpcMaxSubKeyLen返回的RegQueryInfoKey值。
注册表项有两个字符串值:
c - 错误234,具有RegQueryInfoKey和RegEnumValue的更多数据可用-LMLPHP
我做错什么了?为你可能看到的所有错误道歉。这是我的代码:

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;

}

这是我的结果:
c - 错误234,具有RegQueryInfoKey和RegEnumValue的更多数据可用-LMLPHP
谢谢!

最佳答案

您的代码包含许多错误。
(一)
LPWSTR nameOfValue = (LPWSTR)malloc(longestValueName * sizeof(WCHAR));
真的很长这个是
大小不包括终止的空字符。
所以你需要

LPWSTR nameOfValue = (LPWSTR)malloc((longestValueName + 1) * sizeof(WCHAR));

或者(更好)
LPWSTR nameOfValue = (LPWSTR)malloc(++longestValueName * sizeof(WCHAR));

然后在循环中,如果使用第一个变量-sizeOfBufffer = longestValueName + 1
或者在代码中,如果使用++longestValueName
2)DWORD sizeOfData = longestDataComponent;
您必须在循环中执行此操作,as和sizeOfBufffer = longestValueName;因为sizeOfData将在每个RegEnumValue
3)你必须准备好,直到你枚举密钥,有人可以改变关键数据/价值-所以最大可以增加-你得到的调用RegQueryInfoKey只是合理的提示,但不是100%保证。

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

10-12 16:09