如何在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
相关产品推荐
相关产品推荐

