执行 RegGetValueA 时出现错误 87 (INVALID_PARAMETER)

时间:2021-05-04 14:25:47

标签: c++ registry winreg

我的代码:

HKEY hKey;
char *path = "SYSTEM\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001";
LONG result1 = RegOpenKeyExA(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS, &hKey);
QString q = QString::number(result1);

if (result1 == ERROR_SUCCESS) {
    LPDWORD b {};
    char *buffer[250];
    LONG result12 = RegGetValueA(hKey, path, "HwProfileGuid", RRF_RT_REG_SZ, NULL, &buffer, b);

    if (result12 == ERROR_SUCCESS) {

        QMessageBox messageBox1;
        messageBox1.critical(0,"Error", "Sucesso");
        messageBox1.setFixedSize(500,200);
    } else {
        QString q = QString::number(result12);
        QMessageBox messageBox2;
        messageBox2.critical(0,"Error", q);
        messageBox2.setFixedSize(500,200);
    }


} else {
    QMessageBox messageBox2;
    messageBox2.critical(0,"Error", q);
    messageBox2.setFixedSize(500,200);
}

我是初学者,我不确定哪个参数是无效的。

1 个答案:

答案 0 :(得分:1)

RegGetValueA function (winreg.h) - Win32 apps | Microsoft Docs 说:

<块引用>

只有当 pvData 为 NULL 时,pcbData 参数才能为 NULL。

你的pvData&buffer,它不会是NULL,但是你的pcbDatab,它被初始化为NULL .所以这个条件不满足。

似乎还有更多错误:

  • 参数应该是一个指针,其中存储了传递给 pvData 的缓冲区长度。
  • 使用指针数组作为缓冲区来接收数据看起来很奇怪。
  • 已为 RegOpenKeyExA 指定了要读取的键,因此您不应再次为 RegGetValueA 指定该键。否则,它会尝试读取路径 (SYSTEM\...\0001\SYSTEM\...\0001) 下的路径。

部分

LPDWORD b {};
char *buffer[250];
LONG result12 = RegGetValueA(hKey, NULL, "HwProfileGuid", RRF_RT_REG_SZ, NULL, &buffer, b);

应该

char buffer[250];
DWORD b = sizeof(buffer);
LONG result12 = RegGetValueA(hKey, path, "HwProfileGuid", RRF_RT_REG_SZ, NULL, buffer, &b);
相关问题