使用 TRegistry 阅读 MachineGuid

问题描述 投票:0回答:1

我正在尝试从注册表中的

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 社区版

c++builder
1个回答
1
投票

问题是

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.