Перечислять подразделы реестра в Delphi - PullRequest
8 голосов
/ 25 января 2012

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

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

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

1 Ответ

13 голосов
/ 25 января 2012

Лучшее решение - перечислить подключи. Используя 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.


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

...