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

如何在Delphi中使用TRegistry读取Windows注册表值?

TRegistry读取注册表值的正确用法

问题原因

TRegistry.GetValue是Delphi 2009及后续版本新增的简化方法,如果你使用的是更早的Delphi版本(比如Delphi 7、2007等),该方法不存在,这就是代码无法运行的原因。

解决方案

方案一:使用GetValue(适用于Delphi 2009+)

如果你的Delphi版本支持GetValue,需注意该方法是静态方法,无需创建TRegistry实例,直接通过类调用即可。原代码的错误在于实例化TRegistry后调用GetValue,正确写法如下:

uses Windows, Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
  ProductName: string;
begin
  ProductName := TRegistry.GetValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', '');
  ShowMessage('The product name is: ' + ProductName);
end;

方案二:传统方法(兼容所有Delphi版本)

如果你的Delphi版本不支持GetValue,可以用TRegistry的经典操作流程:创建实例 → 打开指定键 → 读取值 → 关闭键 → 释放实例:

uses Windows, Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
  Registry: TRegistry;
  ProductName: string;
begin
  Registry := TRegistry.Create;
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    // 打开指定键,False表示不自动创建不存在的键,KEY_READ为只读权限
    if Registry.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion', False) then
    begin
      // 读取字符串值,第二个参数为键不存在时返回的默认值
      ProductName := Registry.ReadString('ProductName');
      Registry.CloseKey;
    end
    else
      ProductName := '';
    ShowMessage('The product name is: ' + ProductName);
  finally
    Registry.Free;
  end;
end;

额外说明

  • 读取不同类型的注册表值,对应不同的方法:ReadInteger(DWORD值)、ReadBool(布尔值)、ReadBinaryData(二进制数据)等。
  • 64位系统下,若需读取32位注册表分支,创建TRegistry实例时需追加KEY_WOW64_32KEY权限,示例:Registry := TRegistry.Create(KEY_READ or KEY_WOW64_32KEY);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:47:27