2012-01-14 16 views
3

私は分かりません。 Firebirdサーバーのウィンドウレジストリキーが存在するかどうかをチェックします。キーは存在しますが、関数はfalseを返します。 どうしたのですか?私はdelphi 2010でWindows 7 64xを使用しています。デルファイを使用してwinレジストリ - ファイアバードキーを読み込めませんでした

Tks。 Davis。

procedure x; 
    var 
    reg:TRegistry; 
begin 

    reg := TRegistry.Create; 
    reg.RootKey := HKEY_LOCAL_MACHINE; 

    if reg.OpenKey('\SOFTWARE\Firebird Project\Firebird Server\Instances',false)=true then 
    begin 
    ShowMessage('Key exists'); 
    end; 

end; 
+0

関連 - near duplicate:http://stackoverflow.com/questions/2666807/registry-readstring-method-is-not-working-in-windows-7-in-delphi-7とほぼ正確な重複:http: //stackoverflow.com/questions/7547182/why-does-my-application-work-differently-when-running-as-administrator –

答えて

5

最も可能性が高い理由は、あなたがキーの書き込みアクセスを要求するが、UACの下でのWindows 7上を開いたということです、ユーザーは、デフォルトでは、HKLMへの書き込みアクセス権を持っていません。これを解決するにはKEY_READTRegistryコンストラクタに渡すか、OpenKeyではなくOpenKeyReadOnlyを使用して解決します。

次に、64ビットFirebirdサーバーがインストールされている可能性があります。しかし、あなたの32ビットプログラムは32ビットレジストリから読み込み、64ビットFirebirdからキーを見つけることはできません。 2つの異なるレジストリの詳細については、Registry Redirectorを参照してくださいビュー 32ビットプロセスから64ビットレジストリを読み取る方法の詳細については、Accessing an Alternate Registry Viewを参照してください。 Delphiに翻訳されている場合は、をAccessフラグに含める必要があります。ここでも、このフラグをTRegistryコンストラクタに渡すことができます。より便利な場合があります。

あなたは32ビットサーバーを探しているのであれば、要約すると、この

reg := TRegistry.Create(KEY_READ); 

のようなレジストリオブジェクトを作成し、あなたのFirebirdサーバが64ビット、この

reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); 
2

を使用している場合

TRegistry.Create 

を交換してみてください

TRegistry.Create(KEY_READ) 
+0

+1しかし、答えはいくつかの説明で大幅に改善されるだろう。それがなければ、Qを求める人は何も学ばない。 –

+0

私はOPが彼が興味を持っていると言っていないし、彼のコードサンプルが示したように、彼がレジストリに書きたいと思っていなかったので、私はUACなどについて言及しなかった。私のサンプルは、あなたが正しい方向に彼を導くべきであるかどうかを読んだり書いたりするかどうかを設定することを示しています。しかし、+1と助言、ありがとう、ありがとう! –

1

私は、64ビットオペレーティングシステムで32ビットプロセスからレジストリを見ているので、実際には "仮想"レジストリツリーがあります。実際、隠された「サブリダイレクト」がここで働いています。

マイクロソフトのregistry changes in x64-based versions of Windows Server 2003 and in Windows XP Professional x64 Editionを参照してください。

のWindowsのx64ベース バージョンで実行されている

32ビットプログラムと64ビットプログラムは、異なるモードで動作し、レジストリで次 セクションを使用 :

ネイティブモードの64ビット

HKEY_LOCAL_MACHINE\Software 
WOW64モードおよびアクセスキーと値で実行

32ビットプログラムである:サブキー、次のレジストリに格納されているネイティブモードとアクセスキーと 値で実行されるプログラム次のレジストリサブキーに保存されている0:あなたのFirebirdのプロセスが64ビットモードでキーをインストールした場合(上記のマイクロソフトのページから引用)

HKEY_LOCAL_MACHINE\Software\WOW6432node 

だから、彼らはから見えなくなります32ビットプロセス。 Delphi XE2 64ビットモードを使用していない限り、Delphiで動作させるには32ビットのFireBirdクライアントが必要です。

+0

私はここで最後の文がどのように関係するかは実際には分かりません。レジストリキーはサーバーキーです。クライアントはどこに相談しますか? –

+0

@DavidHeffernanサーバが32または64モードでインストールされている場合、32ビットクライアントライブラリがDelphi 32ビットアプリケーションで必要となることを強調したいと思います。レジストリキーが64ビットのサーバーキーである場合、この場合は 'KEY_WOW64_64KEY'フラグが必要です。これは編集した答えに記述したものです。私はちょうど64ビットのウィンドウで実行されている32ビットプロセスに対して、なぜこの*仮想的な "キーリダイレクション"が行われたのか*理由と説明方法を説明したかったのです。 –

0

アプリケーションを管理者として実行してください。 これはあなたの問題を解決すると思います。

関連する問題