使用TRegistry读取MachineGuid失败问题求助
解决TRegistry读取MachineGuid失败的问题
问题原因
在64位Windows系统中,32位程序访问HKEY_LOCAL_MACHINE\SOFTWARE时会被系统自动重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node分支,而MachineGuid实际存储在64位的SOFTWARE主分支下,这就导致32位程序直接读取时找不到目标值。
解决方案
创建TRegistry实例时,在权限参数中添加KEY_WOW64_64KEY标志,强制程序访问64位注册表分支(32位系统会忽略该标志,不影响兼容性)。同时要检查OpenKey的返回值,避免键打开失败后误判值不存在。
修改后的代码
AnsiString S = "MachineGuid: "; TRegistry* Registry = new TRegistry(KEY_READ | KEY_WOW64_64KEY); try { Registry->RootKey = HKEY_LOCAL_MACHINE; // 先确认注册表键是否成功打开 if (Registry->OpenKey("SOFTWARE\\Microsoft\\Cryptography", false)) { if (Registry->ValueExists("MachineGuid")) { S += Registry->ReadString("MachineGuid"); } else { S += "Value not found!"; } } else { S += "Failed to open registry key!"; } } __finally { delete Registry; } Memo2->Lines->Add(S);
额外说明
- 如果你的程序编译为64位版本,默认会直接访问64位注册表分支,无需添加
KEY_WOW64_64KEY标志,但保留该标志可提升代码兼容性。 - 始终检查
OpenKey的返回值,能帮你快速定位是键打开失败还是值不存在的问题。
内容的提问来源于stack exchange,提问作者JKofsky
相关产品推荐
相关产品推荐

