Перечислить подразделы реестра в delphi

Я пытаюсь установить драйвер на клиентский компьютер в зависимости от того, какая версия MySQL установлена ​​на сервере, и для этого я хотел бы проверить версию на сервере через раздел реестра.

Тем не менее, мне нужно перечислить подраздел(ы) HKEY_LOCAL_MACHINE\SOFTWARE\MySQL AB. Обычно под этим ключом находится только один ключ, и он обычно имеет форму: MySQL Server #.#, где # означает число.

Но поскольку я не знаю, какое это значение, есть ли способ получить ключ, а затем я могу получить числа из имени, чтобы определить, какой драйвер установить? Я думаю, что перечисление подразделов - лучший способ получить ключ, но, возможно, умное форматирование строки и цикл тоже сработают?


person Aaron    schedule 25.01.2012    source источник


Ответы (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-битное представление реестра. В 32-разрядном процессе Delphi в 64-разрядной ОС вам нужно будет обойти перенаправление реестра. Сделайте это, передав KEY_WOW64_64KEY конструктору TRegistry.


Альтернативой, которую вы предлагаете, является жесткое кодирование всех возможных значений строки версии в вашем приложении. Это звучит как сбой, ожидающий, как только будет выпущена версия, которой нет в вашем жестко запрограммированном списке.

person David Heffernan    schedule 25.01.2012
comment
Спасибо! Это было то, что я искал, очень просто. Кроме того, для всех, кто может делать что-то подобное, я использовал Registry.RegistryConnect('SomeIP') для подключения к удаленному компьютеру. - person Aaron; 25.01.2012