You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi使用reg query或TRegistry无法读取HKLM下MachineGuid值如何解决

问题原因

你遇到的是64位Windows系统的*注册表重定向(Registry Redirection)*问题,和权限无关:

  • 如果你编译的Delphi程序是32位架构,默认访问HKEY_LOCAL_MACHINE\SOFTWARE路径时,系统会自动将请求转发到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node路径下,该路径下不存在Microsoft\Cryptography\MachineGuid值,因此会返回找不到键/空值的报错。即便以管理员身份运行32位程序,重定向规则依然生效。
  • 你直接在命令行执行reg query命令时,默认调用的是64位版本的cmd/reg工具,访问的是原生64位注册表路径,所以能正常返回结果。

解决方法

方法1:修改TRegistry访问逻辑(推荐)

构造TRegistry实例时加上KEY_WOW64_64KEY标记,强制访问64位注册表节点即可,修改后的代码如下:

// 若你的Delphi版本未预定义该常量,手动添加此行即可
const KEY_WOW64_64KEY = $0100;

procedure TForm1.Button2Click(Sender: TObject);
var
  Registry: TRegistry;
begin
  // 组合权限:读权限 + 强制访问64位注册表
  Registry := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    if Registry.OpenKey('SOFTWARE\Microsoft\Cryptography', False) then
      ShowMessage(Registry.ReadString('MachineGuid'))
    else
      ShowMessage('打开注册表项失败');
  finally
    Registry.Free;
  end;
end;

如果你的程序仅需要在64位系统运行,也可以直接将编译目标改为64位,无需修改代码即可正常读取。

方法2:命令行调用的适配方案

如果要通过调用命令行工具获取结果,需要显式调用64位版本的reg.exe,命令改写为:
C:\Windows\sysnative\reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid
sysnative是32位程序访问64位System32目录的专用别名,可以绕过系统文件重定向规则。

内容的提问来源于stack exchange,提问作者qGold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:36:03