枚举delphi中的注册表子项

Aar*_*ron 8 delphi registry enumerate

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

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

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

Dav*_*nan 13

最好的解决方案是枚举子键.使用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.
Run Code Online (Sandbox Code Playgroud)

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


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