【问题标题】:Error code 87 with RegEnumValue带有 RegEnumValue 的错误代码 87
【发布时间】:2016-08-11 21:31:27
【问题描述】:

我正在尝试使用 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;
} 

我做错了什么?

很抱歉有任何错误。

【问题讨论】:

    标签: c winapi registry


    【解决方案1】:

    lpReserved 必须是 NULL,如文档中所述。您传递一个非空值。这就是失败的原因。删除reserved 变量并简单地将NULL 传递给lpReserved

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

    【讨论】:

    • 那么...我也可以创建reserved 作为指向NULL 的指针,对吗? size 会类似于 DWORD size=wcslen(valueName); 我对吗?
    • 为什么options 错了? MSDN 文章说:“将此参数设置为零或以下”。我没有使用符号链接
    • 传递 NULL。不要使用 wcslen。这是缓冲区的长度。 2001.
    • 由于您使用的是静态数组,您可以使用sizeof(valueName)/sizeof(valueName[0])ARRAYSIZE(valueName) 来获取字符大小。此外,您将WCHAR 用于data[] 数组,但RegEnumValue() 可以返回字符串以外的值类型。您应该使用BYTE 代替data[] 数组(具有足够的字节大小),然后根据返回的type 值对data[] 值进行类型转换。考虑使用RegQueryInfoKey() 来确定最大缓冲区大小,然后进行相应的分配。
    • @Checho 是的,您必须动态分配,例如:WCHAR *valueName = (WCHAR*) malloc((lpcMaxValueNameLen+1)*sizeof(WCHAR)); ... free(valueName);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2020-05-24
    • 2020-12-20
    • 2013-02-09
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多