0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【備忘録】Win10での32bitアプリケーションのレジストリ登録でリダイレクトによる沼にはまった話

Posted at

はじめに

私が今働いている会社も32bitアプリケーションがWindows10やWindows7で運用されていたりします。
Windows10は64bit OS、Windows7以前は32bit OSで動いています。
今回のアプリケーションは、パッケージで環境に展開するのですが、その際バッチファイルでレジストリ登録処理をする箇所があります。
この記事では、32bitアプリケーションがバッチファイルでレジストリ登録する際になぜか登録ができなかった原因、そしてどう解決したのか備忘録として書いていこうと思います。

アプリケーションのバッチファイルによるレジストリ登録で困った問題点

そもそも期待された動きとして、32bit OSと64bit OSでレジストリ登録したいキー値がことなるようにしたかったのです。

これはあくまで例なのですが、以下のように登録したかったのです。

32bit OS
HKLM\SOFTWARE\Key
Key=1

64bit OS
HKLM\SOFTWARE\WOW6432Node\Key
Key=1

64bit OSで32bitアプリケーションを動かす際、リダイレクトと呼ばれるOSの機能によって登録されるキーの場所が異なります。(レジストリのリダイレクトについてはこちらから)

今回はOSによってレジストリキーの登録先が変わります。なので、OSによってバッチファイルが登録先を変更できるように実行したかったのです。

OSのbit数をコマンドプロンプトで判断する方法

そもそもOSが32bitか64bitかを判断する場合はコマンドプロンプトで%PROCESSOR_ARCHITECTURE%を入力することで判断できます。

> %PROCESSOR_ARCHITECTURE

bit数に応じて、以下の結果が返ってきます。

OS 返送結果
32bit x86
64bit AMD64

そのため、バッチファイルでOSで処理を分岐させたい場合は、次のように書けばできます。

if %PROCESSOR_ARCHITECTURE% equ "x86" (
// 32bit OSで実行したいコマンドを記載する。
) else (
// 64bit OSで実行したいコマンドを記載する。
)

なぜ64bit OSでバッチファイルによるレジストリ登録できなかった?

コマンドプロンプトの実行ファイル名はcmd.exeです。
実は64bitOSで32bitアプリケーションがバッチファイルを実行する時、cmd.exeは64bitではなく32bitで動きます。
cmd.exeは32bitと64bitで実行ファイルが異なります。

32bitアプリケーションがバッチファイルを実行する場所

実行OS ファイルパス
32bit c:\windows\Syswow6432\cmd.exe
64bit c:\windows\System32\cmd.exe

このように同じcmd.exeでも32bitか64bitかで実行場所が異なるため、バッチファイルがjっ甲できても上手く分岐ができませんでした。

どう対処した?

結論から言うと、%PROCESSOR_ARCHITEW6432%で解決できました。
このコマンドは返却結果が、%PROCESSOR_ARCHITECTURE%と違います。

OS 返却結果
32bit not found
64bit AMD64

なので、バッチファイルで分岐する場合は次のようにすれば大丈夫です。

if "%PROCESSOR_ARCHITEW6432%" equ "AMD64" (
// Win10で実行したいコマンドを記載する。
) else (
// 32bit OSで実行したいコマンドを記載する。
)

Windows10で32bitアプリケーションのバッチファイルによるレジストリ登録が正常にできるようになりました。
これでリダイレクトの問題も解決です。

最後に

プログラミングの問題ならエラーやログを見れば解決できそうでしたが、コマンドプロンプトの実行exeの問題だったとは思わなかったので思わぬ沼にはまって1日消化してしまいました。
新たな知識が得られたと前向きに捉えて、開発業務をしたいと思います。

PS

Twitterやってます。
https://twitter.com/koji1122wiki
エンジニアとして色々発信しているのでよかったらフォローお願いします。
また質問などはこの記事のコメントからでもツイッターのDMでも大丈夫です。

それでは長々と見てくださり有難うございました!

参考文献

https://ss64.com/nt/syntax-64bit.html
https://wa3.i-3-i.info/word14254.html

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?