所以今天,我一直试图通过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");
}
答案 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;
}