こんにちは、仕事で.NETアプリなんかも作っています。せいや(@knkSeiya)です。
.NETのアプリを作ってると、Windowsのレジストリを編集する必要が出てきたりします。
Windowsのレジストリってあんまり触ったことなくて、見よう見まねでやったら追加したいところにキーが追加できなくて四苦八苦したんですよ。
結構同じ躓き方する人いるんじゃないかなって思って今回は、
「Windowsのレジストリキーが指定場所に追加できなかったときの対処法」について失敗談を交えて紹介します。
レジストリの確認
WindowsのレジストリをGUIで確認・編集したいときは「regedit.exe」を使います。
Windowsの左下の検索ボックスに「regedit」と入力して、「regedit.exe」を実行。
するとレジストリエディターが立ち上がります。
reg addでフルパス指定してもその場所に書かれなかった
レジストリを操作するには、前述のregeditのGUIから編集する他に、コマンドプロンプトからも実行できます。
故あって、GUIじゃなくてコマンドプロンプトからレジストリを操作したかったのでコマンドプロンプトでレジストリを編集していきます。
レジストリにキーを追加したい場合は「reg add」コマンドを使います。
// reg addの書式
reg add [{/v ValueName | /ve}] [/t DataType] [/s Separator] [/d Data] [/f]
MicrosoftのDocsによると<KeyName>はフルパスで指定するらしい。
<KeyName>
サブキーまたは追加されるエントリの完全なパスを指定します。 リモートコンピューターを指定するには、コンピューター名 (\\<ComputerName >) をKeyNameの一部として指定します。 \\ComputerName \ を省略すると、操作は既定でローカルコンピューターに設定されます。 KeyName 有効なルート キーを含める必要があります。 ローカル コンピューターの有効なルート キー: HKLM、HKCU、HKCR、HKU、および HKCC します。 有効なルート キーは、リモート コンピューターが指定されている場合: HKLM および HKU します。 レジストリキー名にスペースが含まれている場合は、キー名を引用符で囲みます。
Microsoft Docsより引用
今回追加したいのはここ、「HKEY_LOCAL_MAHINE¥SOFTWARE¥WOW6432Node¥MyApp」
そんで、以下のようなコマンドを作りました。
# reg add "HKEY_LOCAL_MAHINE¥SOFTWARE¥WOW6432Node¥MyApp" /v "MyValue" /t REG_DWORD /d 1
これをbatファイルにして実行したら期待通りのパスにレジストリが登録できました。ヨシッ!
最終的にアプリのインストーラにbatを組み込んで、アプリからレジストリ書けるか見てみたら・・・、
ない
ないの
登録したはずのレジストリがない!!
というか、
変なところにできてる。
「HKEY_LOCAL_MAHINE¥SOFTWARE¥WOW6432Node¥WOW6432Node¥MyApp」
ナニコレ
WOW6432Nodeが一個多いやん(^ω^;)
さてはオメーあれだろ、コピペミスって2回書いちゃったやつだろ?このおマヌケさんめ☆
・・・
「HKEY_LOCAL_MAHINE¥SOFTWARE¥WOW6432Node¥MyApp」であってる・・・。(3度見)
現代の怪奇現象。勝手にパスが変わるやつ。無から有を生み出す能力。
とても恐ろしい現象で心臓から汗が出ましたが、実はこれ原因がありました。以下解説。
reg addでパスが変わってしまったのはリダイレクトのせい
前置きがだいぶ長くなってしまいました。核心に迫ります。
レジストリには64ビット版と32ビット版の環境が存在します。
そして「WOW6432Node」というディレクトリは、64ビット環境マシンなんだけど、32ビット版レジストリとして登録するための場所。
64ビット環境のマシンで、
32ビットで動作するアプリケーションを実行し、
その中から実行したbatは32ビットで動くので「WOW6432Node」に勝手に格納される。(話がややこしい)
つまり最初に書いたこれ、
# reg add "HKEY_LOCAL_MAHINE¥SOFTWARE¥WOW6432Node¥MyApp" /v "MyValue" /t REG_DWORD /d 1
64ビット動作のコマンドプロンプトから実行すると、パスの中で明示的にWOW6432Nodeを指定してるだけだから、その場所にできる。
32ビット動作のアプリから実行すると、Windowsが勝手にWOW6432Nodeにリダイレクト。
その後、明示したパスが使われることによって「WOW6432Node¥WOW6432Node¥MyApp」という夢空間に飛ばされてしまったと思われる。
最終的に、下のが正解だった。
# reg add "HKEY_LOCAL_MAHINE¥SOFTWARE¥MyApp" /v "MyValue" /t REG_DWORD /d 1
まとめ:Windows嫌い
今回は、「Windowsのレジストリキーが指定場所に追加できなかったときの対処法」について記事にしました。
レジストリにキーが登録できない理由はこれだけとは限りませんが、結構間違えるポイントだと思います。
もし心当たりあったらリダイレクトが発生していないか確認してみると幸せになれるかもしれません。
64ビットと32ビットの動作環境の違いを鑑みて、気を利かせて自動でパスをリダイレクトしてくれる懐の広さ・・・。
僕はWindowsが大好きだよ❤️