【问题标题】:My RegSetValueA function is returning ERROR_SUCCESS but not working我的 RegSetValueA 函数返回 ERROR_SUCCESS 但不起作用
【发布时间】:2025-12-12 18:30:01
【问题描述】:

我的代码:

    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) {

        char buffer[39];
        DWORD b = sizeof(buffer);
        LONG result12 = RegGetValueA(hKey, NULL, "HwProfileGuid", RRF_RT_REG_SZ, NULL, buffer, &b);

        if (result12 == ERROR_SUCCESS) {
            std::string j;
            LONG result13;
            const std::vector<int> serial1{8, 4, 4, 4, 12};
            std::string l = "{" + gen_random(serial1, "-") + "}";
            const char *p = l.c_str();
            if (p == buffer) {
                j = "{" + gen_random(serial1, "-") + "}";
                const char *i = j.c_str();
                result13 = RegSetValueA(hKey, "HwProfileGuid", REG_SZ, i, sizeof(i));
            } else {
                result13 = RegSetValueA(hKey, "HwProfileGuid", REG_SZ, p, sizeof(p));
            }

            if (result13 == ERROR_SUCCESS) {
                QMessageBox messageBox2;
                messageBox2.critical(0,"Error", "Success");
                messageBox2.setFixedSize(500,200);
            } else {
                QString q = QString::number(result13);
                QMessageBox messageBox2;
                messageBox2.critical(0,"Error", q);
                messageBox2.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);
    }

我的操作系统是 Windows 64 位,编译器没有显示任何错误,并且由于某种原因,该函数可以创建一个新值,但不能更改现有值的数据。

我已经编辑并添加了完整的代码,因此您可以看到我正在处理的数据类型。

【问题讨论】:

  • 单步调试代码时调试器会说什么?
  • @tadman 你明白我的意思。
  • 我假设您正在尝试在这里比较字符串数据:if (p == buffer) 根据buffer 是什么,这将不起作用。直接将std::string 与另一个字符串进行比较,或者通过char 指针的隐式转换或使用strcmp。第一个在 C++ 中是首选。考虑将minimal reproducible example 放在一起,这可能会帮助您自己缩小问题范围或填补空白以供其他人帮助。
  • 正如@RetiredNinja 指出的那样,if (p == buffer) 永远不会是true,因为这些指针指向不同的内存位置。此外,sizeof(p) 是指针的大小(在本例中为 8),而不是字符串的长度。
  • @El_Sapo_Pepe 你说操作系统是 64 位的,但你是把你的应用程序编译成 32 位还是 64 位?注册表为 32 位和 64 位应用程序提供了单独的区域,因此请阅读 Accessing an Alternate Registry View 并在需要时使用适当的 KEY_WOW64_(32|64)KEY 标志。此外,RegSetValueA() 是旧版 16 位 API,您应该改用 RegSetValueExA()

标签: c++ windows winapi registry


【解决方案1】:

您需要使用RegSetValueExA 并调用:

BYTE* p = (BYTE*)l.c_str();
result13 = RegSetValueExA(hKey, "HwProfileGuid",0, REG_SZ, p, l.size() + 1);.

它对我有用。

【讨论】: