C ++通过RegGetValue读取机器GUID

时间:2018-01-24 22:49:42

标签: c++ winapi registry

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

对于我尝试在注册表中读取的几乎所有其他值,RegGetValue对我来说很好,但由于某种原因(输出=没有),它不能用于MachineGuid。

有没有人知道如何处理这个问题?我该如何正确地进行检索?(最好是字符串) 很抱歉,如果这是一个noob-ish问题,我现在还不知道该做什么。 谢谢!

#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");

}

1 个答案:

答案 0 :(得分:2)

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

更重要的是,您需要传递正确的缓冲区大小(以字节为单位)。您只分配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;
}