C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

レジストリ書込・参照時の「WOW6432Node」について /鯖江ミナ (19/10/09(Wed) 11:23) #92591
Re[1]: レジストリ書込・参照時の「WOW6432Node」について /魔界の仮面弁士 (19/10/09(Wed) 12:50) #92595
│└ Re[2]: レジストリ書込・参照時の「WOW6432Node」について /鯖江ミナ (19/10/09(Wed) 12:56) #92597 解決済み
Re[1]: レジストリ書込・参照時の「WOW6432Node」について /とっちゃん (19/10/09(Wed) 12:07) #92594
  └ Re[2]: レジストリ書込・参照時の「WOW6432Node」について /鯖江ミナ (19/10/09(Wed) 12:54) #92596 解決済み


親記事 / ▼[ 92595 ] ▼[ 92594 ]
■92591 / 親階層)  レジストリ書込・参照時の「WOW6432Node」について
□投稿者/ 鯖江ミナ (1回)-(2019/10/09(Wed) 11:23:45)

分類:[VB.NET/VB2005 以降] 

VB(VB2013, 2017)でWindowsアプリを開発していますが、
最近になって疑問に思ったことがあります。
インストーラーを作成してアプリをインストールする際に
インストーラー側でレジストリ書き込みする場合、
例えば「HKEY_LOCAL_MACHINE\SOFTWARE\(ソフト名)」キーを作成して書き込みを行う場合、
32ビットアプリ(x86でビルド)の場合だと
「HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\(ソフト名)」のように、
「WOW6432Node」キー配下にキーが作成されます。
キー参照の場合も、「HKEY_LOCAL_MACHINE\SOFTWARE\(ソフト名)」キーを参照しようとすると、
実際には「HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\(ソフト名)」キーが参照されます。

一方、例えばソフト実行時に
「HKEY_CURRENT_USER\Software\(ソフト名)」キーを作成して書き込みを行う場合、
32ビットアプリ(x86でビルド)の場合でも、レジストリのパスはそのままに
「HKEY_CURRENT_USER\Software\(ソフト名)」のキーが作成され、
「WOW6432Node」配下にはキーが作成されません。

これらは何らかのルールに則って処理がなされているのでしょうか?
(インストールの場合は特別に「WOW6432Node」が考慮される、とか)

また、例えば、ソフト(VB)側で、
「HKEY_CURRENT_USER\Software\(ソフト名)」キーがなかったら
「HKEY_CURRENT_USER\Software\WOW6432Node\(ソフト名)」キーを参照する
(あるいは逆)ようなことは簡単にできるのでしょうか?
[ □ Tree ] 返信 編集キー/

▲[ 92591 ] / ▼[ 92597 ]
■92595 / 1階層)  Re[1]: レジストリ書込・参照時の「WOW6432Node」について
□投稿者/ 魔界の仮面弁士 (2421回)-(2019/10/09(Wed) 12:50:13)
No92591 (鯖江ミナ さん) に返信
> 32ビットアプリ(x86でビルド)の場合でも、レジストリのパスはそのままに
> 「HKEY_CURRENT_USER\Software\(ソフト名)」のキーが作成され、
> 「WOW6432Node」配下にはキーが作成されません。

.NET Framework からアクセスする場合は、RegistryView パラメーターで
明示的に切り替えることができます。

 RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
 RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)


> これらは何らかのルールに則って処理がなされているのでしょうか?
> (インストールの場合は特別に「WOW6432Node」が考慮される、とか)

動作ターゲットが WOW64 かどうか、とか。

同様のものとして、ファイル システム リダイレクタという機構がありますね。

64bit 環境上の 32bit プロセスから "C:\Windows\System32\" ディレクトリにアクセスすると、
実際には C:\Windows\SysWOW64\ ディレクトリへの参照となることがあります。
この場合、本当に C:\Windows\System32\ ディレクトリを参照するために、
"C:\Windows\SysNative\" という仮想ディレクトリパスを使う必要があります。

一方、64bit プロセスからだと Sysnative 仮想ディレクトリは使えませんので、
"C:\Windows\System32\" と "C:\Windows\SysWOW64\" をそのまま使います。
[ 親 92591 / □ Tree ] 返信 編集キー/

▲[ 92595 ] / 返信無し
■92597 / 2階層)  Re[2]: レジストリ書込・参照時の「WOW6432Node」について
□投稿者/ 鯖江ミナ (3回)-(2019/10/09(Wed) 12:56:47)
魔界の仮面弁士様、ありがとうございます。
色々と勉強になります。
ありがとうございました♪(^ε^)chu
解決済み
[ 親 92591 / □ Tree ] 返信 編集キー/

▲[ 92591 ] / ▼[ 92596 ]
■92594 / 1階層)  Re[1]: レジストリ書込・参照時の「WOW6432Node」について
□投稿者/ とっちゃん (636回)-(2019/10/09(Wed) 12:07:57)
No92591 (鯖江ミナ さん) に返信

> これらは何らかのルールに則って処理がなされているのでしょうか?
> (インストールの場合は特別に「WOW6432Node」が考慮される、とか)
>
HKEY_LOCAL_MACHINE\Software\ キーは、32bit/64bit で専用のキーを見るように
OS側で自動的にリダイレクト(参照先の変更)が行われるようになっています。


> また、例えば、ソフト(VB)側で、
> 「HKEY_CURRENT_USER\Software\(ソフト名)」キーがなかったら
> 「HKEY_CURRENT_USER\Software\WOW6432Node\(ソフト名)」キーを参照する
> (あるいは逆)ようなことは簡単にできるのでしょうか?

一方、HKEY_CURRENT_USER\Software\ キーはリダイレクトの対象にはなっていないため
こちらは、32bitアプリでも 64bitアプリでも同じレジストリが参照されます。

そのため、アプリが32bitであろうが、64bitであろうが、HKEY_CURRENT_USER\Software キーに関しては
切り替えるような仕組みはありません。
アプリ側で32/64で別々のキーとしたいのなら、別の方法を考える必要があります。

例えば、
HKEY_CURRENT_USER\Sowtware\(ソフト名)\x86\...
HKEY_CURRENT_USER\Sowtware\(ソフト名)\x64\...
と、キーアクセスのところに32/64の区別を行うようなキーを挟む。

というように、独自に対応する必要があります。

HKEY_CURRENT_USER\Software\WOW6432Node\(ソフト名)\ とする場合でも自分で環境を見て
レジストリキー文字列を組み立てる必要があります。

[ 親 92591 / □ Tree ] 返信 編集キー/

▲[ 92594 ] / 返信無し
■92596 / 2階層)  Re[2]: レジストリ書込・参照時の「WOW6432Node」について
□投稿者/ 鯖江ミナ (2回)-(2019/10/09(Wed) 12:54:45)
とっちゃん様、ありがとうございます。
HKEY_CURRENT_USER\Software\ キーに関しては、32bitでも64bitでも
「HKEY_CURRENT_USER\Software\(ソフト名)」そのものが参照できればいいので、
何も気にする必要はない、ということですね。
スッキリしました。
ありがとうございました♪(^ε^)
解決済み
[ 親 92591 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -