気まま研究所ブログ

ITとスーパーカブ、思ったことをてきとーに書きます。

WOW64で起動した際に64bitレジストリへアクセスする

64bit OSにおいて、32bitビルドしたアプリケーションはWOW64を通して実行されます。
普通にプログラムを組んでる分にはさほど意識する必要はありませんが、レジストリを扱う場合少々面倒なことになります。

32bitアプリケーションを32bitで実行し、レジストリにアクセスした際はどこにアクセスしようが特に気にする必要はありませんが、64bitにおいては一部だけWow6432Nodeの場所を指定していまいます。
64bitでビルドすればこの問題は回避できるのですが、そうもいきません。

巷に転がっている方法でレジストリを取得する場合は

RegistryKey rKey = Registry.LocalMachine.OpenSubKey("キーの名前");
string value = (string)rKey.GetValue("値の名前");
rKey.Close();

こういったコードで取得しますが、これだとWOW64で実行された場合Wow6432Nodeの値を拾ってしまいます。
Wow6432Nodeでない方の値を取得する場合は

RegistryKey prerKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey rKey = prerKey.OpenSubKey("キーの名前");
string value = (string)rKey.GetValue("値の名前");
rKey.Close();
prerKey.Close();

こうすることでWow6432Nodeでない方の値が取得できます。

なお、32bit OSでRegistryView.Registry64を指定した場合は32bitビューが表示されます。

参考になれば幸いです。

追記

書き込みに関しても同様にOpenBaseKey関数を実行し、CreateSubKeyメソッドを実行することで可能です。

var prerKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var rKey = prerKey.CreateSubKey("キーの名前", RegistryKeyPermissionCheck.ReadWriteSubTree);
rKey.SetValue("値の名前", "データ");
rKey.Close();
prerKey.Close();

ただし書き込みに関しては管理者権限が必要です。