枚举delphi中的注册表子项

时间:2012-01-25 15:04:25

标签: delphi registry enumerate

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

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

但是因为我不知道它们是哪个值,有没有办法获取密钥然后我可以从名称中获取数字以确定要安装哪个驱动程序?我认为枚举子键是获取键的最佳方法,但也许一个聪明的字符串格式和循环也可以工作?

1 个答案:

答案 0 :(得分:13)

最佳解决方案是枚举子键。使用RegEnumKeyEx,您只需在一个简单的循环中执行此操作,直到无法再枚举任何键。

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

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构造函数来实现这一点。


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