繁体   English   中英

枚举delphi中的注册表子项

[英]Enumerate registry subkeys in delphi

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

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

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

最好的解决方案是枚举子键。 使用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构造函数来做到这一点。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM