【问题标题】:C++ Read machine GUID via RegGetValueC++ 通过 RegGetValue 读取机器 GUID
【发布时间】:2018-07-04 02:51:17
【问题描述】:

所以今天,我一直在尝试通过 RegGetValue 从 C++ 中的注册表获取 MachineGuid 值。

RegGetValue 在我尝试在注册表中读取的几乎所有其他值上都可以正常工作,但由于某种原因不适用于 MachineGuid(输出 = 无)。

有人知道如何解决这个问题吗?我如何正确检索它?(最好是字符串) 抱歉,如果这是一个菜鸟问题,我只是不知道此时还能做什么。 谢谢!

#define BUFFER 8192
int main{
char value[255];
DWORD BufferSize = BUFFER;
RegGetValueA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGuid", RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize);
std::cout << value << std::endl; // Returns absolutely nothing.
system("pause");

}

【问题讨论】:

  • 你在向操作系统撒谎你的缓冲区大小。但是我不确定这会伤害到你。
  • 检查返回值,记住注册表函数成功返回0。
  • 感谢您的建议,但正如我所说,当我尝试读取其他注册表值时,它工作得非常好。它实际上成功地输出了值。由于某种原因不适用于 MachineGuid....
  • 这就是你检查返回值的原因,这样你就可以找出函数在这种特殊情况下认为什么(如果有的话)是错误的。如果结果调用成功但仍然没有输出(特别是返回的缓冲区大小),那么事情就很奇怪了。

标签: c++ winapi registry


【解决方案1】:

您没有正确地将value 缓冲区传递给RegGetValueA()。摆脱 &amp; 运算符(和类型转换)。让数组自然衰减成指针。

更重要的是,您需要传递正确的缓冲区大小,以字节为单位。您只分配了 255 个字节,但告诉 RegGetValueA() value 有 8192 个字节可用,这是一个谎言。尽管MachineGuid 成功时只会返回 37 个字节,但您不应该对 API 撒谎。

另外,你需要检查RegGetValueA()的返回值,看看是成功还是失败,如果失败了,你可以找出失败的原因。

试试这个:

int main()
{
    char value[255];
    DWORD BufferSize = sizeof(value);
    LONG res = RegGetValueA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGuid", RRF_RT_REG_SZ, NULL, value, &BufferSize);
    if (res == 0)
    {
        std::cout << value << std::endl;

        /* alternatively:
        std::cout.write(value, BufferSize-1); // -1 to ignore the null terminator
        std::cout << std::endl;
        */
    }
    else
        std::cerr << "Error: " << res << std::endl;

    std::system("pause");
    return 0;
}

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多