64 ビット Windows 7 でレジストリ リダイレクトが機能するように、32 ビット C# アプリでレジストリを読み取るにはどうすればよいですか?
-
21-09-2019 - |
質問
私の上司は Windows 7 を入手したばかりで、XP で完全に正常に動作するインストーラーの 1 つを実行してみました。Windows 7 では、インストーラーはエラーを表示せずに実行されます。ただし、HKEY_LOCAL_MACHINE\SOFTWARE{Company}{product} の下にレジストリ キーは作成されません。これらのキーは XP では正しく作成されます。
この問題に遭遇した人はいますか?権利やセキュリティの問題ではないかと思いますが、よくわかりませんし、試すための Windows 7 も持っていません。
編集
問題のコンピュータは、64 ビット Windows を実行している 64 ビット マシンです。Windows 7 は 32 ビット アプリケーションを HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node{Company}{product} にリダイレクトすることが判明しました。問題は、アプリケーション コードが次のようなハードコードされた値を使用してレジストリにアクセスしようとすることです。
var t = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\..., "ValueName", DefaultValue);
そこで、私の新たな質問は、Windows 9 レジストリ リダイレクトが機能するようにレジストリにアクセスするにはどうすればよいでしょうか?
解決 2
後より、私は<のhref = "http://social.msdn.microsoft.com/Forums/en/netfx64bit/thread/92f962d6-7f5e-4e62-ac0a-b8b0c9f552a3" のrel = "nofollowをnoreferrerこの出くわした掘り.NETアプリケーションのレジストリアクセスルールを記述する「>リンクする。私のプログラムは、最初のアプリは、WindowsがWOW6432NODEの下でそれをインストールしていても、64ビットのレジストリをターゲットにする原因となる「AnyCpu」を対象としていました。私のプログラムの「x86」にターゲットを設定することで、「魔法」WOW6432NODE下のレジストリへのアクセスを開始しました。ゴーフィギュア!
他のヒント
います。純4, き具体的には要求の32ビットまたは64ビット)プロセスアクセスの64ビットのレジストリを使用 RegistryKey.OpenBaseKey
方法。
Cf. http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey.aspx
以下に例を示しますことを読み取り値の64ビットのレジストリの場合でも、での一環として32ビットプロセス:
var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var key = hklm.OpenSubKey(@"SOFTWARE\AcmeSoft\AnvilMaker 1.0");
var value = (string) key.GetValue("Blacksmith Name");
の RegistryKey.OpenBaseKey
法ることもできる明示的に開32ビットのレジストリ。これがなければならないときに便利ですしようとしていを行ってみてはいかがでしょうその他の方法とアクセスの32ビットのレジストリから64ビットのみ使用いを明示的に追加"Wow6432Node"のレジストリパスです。
例えば、今日の必要を削除するにはサブキーの木 両 は、32-bitおよび64ビットのレジストリ。うことです。純4単一レジストリのパスは簡単でした:
foreach(var view in new[] {RegistryView.Registry32, RegistryView.Registry64})
{
var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view);
hklm.DeleteSubKeyTree(@"SOFTWARE\AcmeSoft\SomeKeyWeNoLongerWant", throwOnMissingSubKey: false);
}
64bit版windowsでは、上記のコードを削除します以下のサブキーの樹木からのレジストリ:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\AcmeSoft\SomeKeyWeNoLongerWant
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AcmeSoft\SomeKeyWeNoLongerWant
-アダム
C Windows API では、これは次の設定によって行われます。 samDesired
のパラメータ RegOpenKeyEx
に呼び出します KEY_WOW64_64KEY. 。これは、レジストリ値の検索が WOW32Node エントリではなく、通常の 64 ビット エントリにマップされることを意味します。ただし、Registry クラスはこれらの操作をサポートしていないようなので、.Net でこれをどのように実現するのかわかりませんが、おそらく新しいクラスを通じて提供されているのでしょうか?