返回

如何在 Delphi 中读取 Windows 11 系统路径?

windows

Delphi 读取 Windows 11 系统路径

前言

Delphi 开发者在 Windows 11 系统中可能会遇到从注册表读取系统路径的问题。这篇文章将提供分步指南,详细介绍如何克服这一挑战。

问题

Delphi 应用程序无法读取位于以下注册表路径中的系统路径:

SYSTEM\CurrentControlSet\Control\Session Manager\Environment\path

解决方案

1. 启用 WOW64 访问

通过启用 WOW64(Windows 上 32 位子系统)访问,应用程序可以访问 32 位注册表项。在 Delphi 中,前往 Tools -> Options -> Manifest,选中 Enable 32-bit WOW64 redirection support

2. 使用正确的权限创建注册表

创建具有足够权限的注册表对象非常重要。使用 CreateRegistry 函数来完成此操作,它需要以下参数:

  • RegistryRootKey:指定注册表根键(例如 HKEY_LOCAL_MACHINE)
  • RegPath:要创建的注册表路径(例如 SYSTEM\CurrentControlSet\Control\Session Manager\Environment

代码示例:

procedure CreateRegistry(const RegistryRootKey: TRegistryRootKey; const RegPath: String);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  reg.RootKey := RegistryRootKey;
  reg.Access := KEY_ALL_ACCESS or KEY_WOW64_64KEY;
  if not reg.KeyExists(RegPath) then
    reg.CreateKey(RegPath);
  reg.Free;
end;

3. 读取路径属性

使用 GetPath 函数来读取系统路径。此函数需要以下参数:

  • RegistryRootKey:指定注册表根键(例如 HKEY_LOCAL_MACHINE)
  • RegPath:包含系统路径的注册表路径

代码示例:

function GetPath(const RegistryRootKey: TRegistryRootKey; const RegPath: String): String;
var
  reg: TRegistry;
  result: String;
begin
  reg := TRegistry.Create;
  reg.RootKey := RegistryRootKey;
  reg.Access := KEY_READ or KEY_WOW64_64KEY;
  if reg.KeyExists(RegPath) then
    reg.OpenKey(RegPath, False);
  if reg.ValueExists('Path') then
    result := reg.ReadString('Path');
  reg.Free;
end;

示例代码

以下代码示例演示了如何使用 CreateRegistryGetPath 函数:

procedure TfrmMain.FormActivate(Sender: TObject);
begin
  // 创建注册表对象
  CreateRegistry(HKEY_LOCAL_MACHINE,
    'SYSTEM\CurrentControlSet\Control\Session Manager\Environment');

  // 读取系统路径
  Edit1.Text := GetPath(HKEY_LOCAL_MACHINE,
    'SYSTEM\CurrentControlSet\Control\Session Manager\Environment');
end;

注意事项

  • 确保应用程序以管理员权限运行。
  • 这些步骤适用于 64 位 Windows 11 系统。
  • 确保注册表路径拼写正确。

常见问题解答

1. 我为什么要启用 WOW64 访问?

WOW64 访问允许 32 位 Delphi 应用程序访问 32 位注册表项,其中存储了系统路径。

2. 如何检查我的应用程序是否以管理员权限运行?

在 Delphi 中,使用 Application.Privileges 属性检查应用程序的权限。如果 Application.Privileges.HasAdminAccess 为 true,则应用程序具有管理员权限。

3. 我可以在 32 位 Windows 11 系统中使用这些步骤吗?

否,这些步骤仅适用于 64 位 Windows 11 系统。

4. 如果我遇到错误,该怎么办?

仔细检查注册表路径和函数调用是否正确。确保应用程序具有管理员权限,并且系统满足所有要求。

5. 还有其他方法可以读取系统路径吗?

有,但这些方法可能涉及更复杂的编码或平台特定的 API。