枚举delphi中的注册表子项

Posted

技术标签:

【中文标题】枚举delphi中的注册表子项【英文标题】:Enumerate registry subkeys in delphi 【发布时间】:2012-02-18 18:20:45 【问题描述】:

我正在尝试根据服务器上安装的 mysql 版本在客户端计算机上安装驱动程序,为此我想通过注册表项检查服务器上的版本。

也就是说,我需要枚举HKEY_LOCAL_MACHINE\SOFTWARE\MySQL AB 的子键。这个键下通常只有一个键,格式一般为:MySQL Server #.#,其中# 代表数字。

但是因为我不知道这些值是什么,有没有办法获取密钥,然后我可以从名称中获取数字来确定要安装哪个驱动程序?我认为枚举子键是获取密钥的最佳方式,但也许巧妙的字符串格式化和循环也可以?

【问题讨论】:

【参考方案1】:

最好的解决方案是枚举子键。使用RegEnumKeyEx,您只需在一个简单的循环中执行此操作,直到没有更多的键可以枚举。

但是,在 Delphi 中使用 TRegistry 枚举子键更加容易:

program _EnumSubKeys;

$APPTYPE CONSOLE

uses
  SysUtils, Classes, Windows, Registry;

procedure EnumSubKeys(RootKey: HKEY; const Key: string);
var
  Registry: TRegistry;
  SubKeyNames: TStringList;
  Name: string;
begin
  Registry := TRegistry.Create;
  Try
    Registry.RootKey := RootKey;
    Registry.OpenKeyReadOnly(Key);
    SubKeyNames := TStringList.Create;
    Try
      Registry.GetKeyNames(SubKeyNames);
      for Name in SubKeyNames do
        Writeln(Name);
    Finally
      SubKeyNames.Free;
    End;
  Finally
    Registry.Free;
  End;
end;

begin
  EnumSubKeys(HKEY_LOCAL_MACHINE, 'Software\Microsoft');
  Readln;
end.

您应该注意的一件事是必须在注册表的 64 位视图中进行搜索。如果您安装了 64 位版本的 MySQL,那么我希望它使用注册表的 64 位视图。在 64 位操作系统上的 32 位 Delphi 进程中,您需要避开注册表重定向。通过将KEY_WOW64_64KEY 传递给TRegistry 构造函数来做到这一点。


您建议的替代方法是将版本字符串的所有可能值硬编码到您的应用程序中。这听起来像是一个等待在您的硬编码列表中没有的版本发布后立即发生的失败。

【讨论】:

谢谢!这就是我要找的,非常简单。此外,对于可能正在做类似事情的其他人,我使用 Registry.RegistryConnect('SomeIP') 连接到远程计算机。

以上是关于枚举delphi中的注册表子项的主要内容,如果未能解决你的问题,请参考以下文章

golang 无法枚举注册表项的子项

我无法删除注册表子项

如何注册DELPHI3中的HTML.OCX控件?

Delphi 读写注册表

delphi 获取本地IP地址的几种方法

Windows 注册表——子项列表