8

サーバーにインストールされているMySQLのバージョンに基づいてクライアントマシンにドライバーをインストールしようとしています。そのために、レジストリキーを使用してサーバーのバージョンを確認します。

そうは言っても、のサブキーを列挙する必要がありHKEY_LOCAL_MACHINE\SOFTWARE\MySQL ABます。通常、このキーの下にはキーが1つだけあり、通常は次の形式になりますMySQL Server #.#。ここで、#は数字を表します。

But because I don't know which value those are, is there a way to get the key and then I can get the numbers from the name to determine which driver to install? I'm thinking that enumerating the subkeys is the best way to get the key, but perhaps a clever string formatting and loop would work too?

4

1 に答える 1

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.

注意すべきことの 1 つは、レジストリの 64 ビット ビューで検索する必要があることです。MySQL の 64 ビット バージョンがインストールされている場合は、レジストリの 64 ビット ビューを使用することを期待しています。64 ビット OS 上の 32 ビット Delphi プロセスでは、レジストリ リダイレクトを回避する必要があります。コンストラクタに渡すKEY_WOW64_64KEYことでそれを行います。TRegistry


あなたが提案する代替手段は、バージョン文字列のすべての可能な値をアプリケーションにハードコーディングすることです。ハードコードされたリストにないバージョンがリリースされるとすぐに発生するのを待っている障害のように聞こえます。

于 2012-01-25T15:21:29.253 に答える