使用RegEnumValue的错误代码87

时间:2016-08-11 21:31:28

标签: c winapi registry

我试图使用RegEnumValue显示单个值的名称(我可以使用RegGetValue,但我正在尝试学习如何使用RegEnumValue函数),但我收到错误代码87,“参数不正确”。

这是我的代码:

int wmain()
{
    //RegOpenKeyEx
    HKEY hKey = HKEY_CURRENT_USER;
    LPCWSTR subKey = L"WinSide";
    DWORD options = 0;
    REGSAM samDesired = KEY_QUERY_VALUE;
    HKEY pkOpenResult;

    //RegEnumValue
    DWORD index = 0;
    WCHAR valueName[16383];
    LPWSTR pValueName = valueName;
    DWORD size=sizeof(valueName);
    DWORD reserved = NULL;
    DWORD type;
    WCHAR data[255];
    LPWSTR pData=data;
    DWORD sizeData = sizeof(data);

    LONG openKey = RegOpenKeyEx(hKey, subKey, options, samDesired, &pkOpenResult);

    if (openKey != ERROR_SUCCESS)
    {
        wprintf(L"Error opening the key. Code: %li\n");
    }
    else
    {
        wprintf(L"Key opened!\n");

        LONG enumValue = RegEnumValue(pkOpenResult, index, pValueName, &size,
                                        &reserved, &type, pData, &sizeData);

        if (enumValue != ERROR_SUCCESS)
            wprintf(L"Error code: %li\n", enumValue);
        else
        {
            wprintf(L"Going to show the value's name here!");
        }

        RegCloseKey(pkOpenResult);
    }


    return 0;
} 

我做错了什么?

对于任何错误都很抱歉。

1 个答案:

答案 0 :(得分:1)

lpReserved必须为NULL,如文档中所述。您传递一个非null值。这就是失败的原因。移除reserved变量,只需将NULL传递给lpReserved即可。

lpcchValueName参数指定字符而不是字节。您传递错误的字节数。这个错误现在肯定不会对你造成伤害,但是在制作中存在缓冲区溢出错误,所以你需要修复它。