我正在尝试从注册表中的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
读取MachineGuid。我查看了几篇关于执行此操作的帖子,并基于它们编写了我的代码。
我在按钮
OnClick()
事件中有以下代码用于测试:
AnsiString S = "MachineGuid: ";
TRegistry* Registry = new TRegistry(KEY_READ);
try {
Registry->RootKey = HKEY_LOCAL_MACHINE;
// False because we do not want to create it if it doesn’t exist
Registry->OpenKey("SOFTWARE\\Microsoft\\Cryptography", false);
// Registry->OpenKeyReadOnly("SOFTWARE\\Microsoft\\Cryptography");
if (!Registry->ValueExists("MachineGuid")) {
S += String("Key not found!");
} else {
S += Registry->ReadString("MachineGuid");
}
} __finally
{
delete Registry;
}
Memo2->Lines->Add(S);
问题是,无论我使用
Registry->ValueExists("MachineGuid")
还是false
,OpenKey()
总是报告OpenKeyReadOnly()
。我不知道我做错了什么。
这是我第一次使用
TRegistry
。
使用:C++ Builder 11.3 社区版
问题是
MachineGuid
值仅在注册表中的64位应用程序数据中可用。
您可以通过注册表请求 64 位 view 的访问权限来解决这个问题。无论您的应用程序是针对 32 位还是 64 位编译的,这都适用:
TRegistry* Registry = new TRegistry(KEY_READ | KEY_WOW64_64KEY);
示例:
void __fastcall TForm1::Button1Click(TObject* Sender)
{
UnicodeString S = "MachineGuid";
auto Registry = std::make_unique<TRegistry>(KEY_QUERY_VALUE | KEY_WOW64_64KEY);
try {
Registry->RootKey = HKEY_LOCAL_MACHINE;
if (Registry->OpenKeyReadOnly("SOFTWARE\\Microsoft\\Cryptography")) {
if (!Registry->ValueExists(S)) {
S += ": " + String("Key not found!");
} else {
S += ": " + Registry->ReadString(S);
}
} else {
S += ": " + String("OpenKeyReadOnly failed");
}
} catch (...) {
S += ": Exception";
}
Memo2->Lines->Add(S);
}