Windows で 32bit/64bit を確実に判断する|PROCESSOR_ARCHITECTUREとPROCESSOR_ARCHITEW6432

どうもながやすです。
今回は Windows にて使っているPCが 32bit なのか 64bit なのかを調べる時の落とし穴についてです。PROCESSOR_ARCHITECTURE だけでは意外にハマるかもしれませんので、最後までご一読いただければさいわいです。

スポンサーリンク

よくあるパタン:環境変数 PROCESSOR_ARCHITECTURE

Windows では環境変数 PROCESSOR_ARCHITECTURE により、プロセッサの種類を知ることができます。環境変数 PROCESSOR_ARCHITECTURE は、例えば、32ビットであれば”x86″、64ビットであれば”AMD64″もしくは”IA64″といった値になります。下記は 32bit CPU にて DOS窓で下記のようにPROCESSOR_ARCHITECTURE変数を表示した場合の例です。

c:\>echo %PROCESSOR_ARCHITECTURE%
x86

また、 64 bit CPU だとこうなります(IA64と表示されるかも)。

c:\>echo %PROCESSOR_ARCHITECTURE%
AMD64

バッチファイル内で分岐させるなら下記のようになりますね。

@echo off
setlocal

if "%PROCESSOR_ARCHITECTURE%" EQU "x86" (
    echo "32bit"
)
if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" (
    echo "64bit"
)

ここまでは特に問題ないですね、想定通り。

環境変数を PROCESSOR_ARCHITECTURE をアプリから表示させてみる

ここでちょっとした実験をします。面倒な人はこの節は飛ばしてください

この便利な環境変数 PROCESSOR_ARCHITECTURE ですが、弱点があります。例えば 64bit CPU をお使いで、かつ、下記の Windows 向け Emacs を使っている人は簡単な実験をしてみてください。

scratchバッファで下記の elispを実行してみてください。閉じカッコのところで C-x C-e で実行できます。エコーエリア(Emacs の最下部のところ)に結果が表示されます。処理内容は環境変数 PROCESSOR_ARCHITECTURE を表示しているだけです。

(message "PROCESSOR_ARCHITECTURE is %s." (getenv "PROCESSOR_ARCHITECTURE"))

AMD64 か IA64 が表示されそうなものですが、下記のように x86 と表示されるかと思います。

PROCESSOR_ARCHITECTURE is x86.

64bit なのに 32bit と判定されてしまっています。なんてこった。

WOW64 と PROCESSOR_ARCHITECTURE

Emacs 上で、 環境変数 PROCESSOR_ARCHITECTURE が 32bitを示す x86 になったのはなぜでしょうか。それは使っている Emacs が 32bit CPU 向けにビルドされているからです。もちろん32bit向けアプリケーションは 64bit 環境ではそのままでは動きません。そのため Windows では WOW64 というエミュレータが 32bitアプリケーションを 64bit CPU 上で動かします。32bit 環境をエミュレートするわけですね。ですので、32bit アプリケーションは自分が32bit 環境で動いている気になっています。そのため、上記のように32bit アプリケーション上では環境変数 PROCESSOR_ARCHITECTURE も32bitを示す値を返してしまいます。

環境変数 PROCESSOR_ARCHITEW6432 を使おう

では、32bit アプリケーション上からは実際の CPU が32bitか 64bit か判断できないのでしょうか?もちろん、判断できます。環境変数 PROCESSOR_ARCHITEW6432 を使えば OK です。この環境変数には WOW64 が元のPROCESSOR_ARCHITECTUREを退避してくれています。

(message "PROCESSOR_ARCHITEW6432 is %s." (getenv "PROCESSOR_ARCHITEW6432"))

実行結果は下記のようになるはずです。

PROCESSOR_ARCHITEW6432 is AMD64.

ちなみに PROCESSOR_ARCHITEW6432 はWOW64 のみで有効になりますのでご注意を。32bit/64bit にてどの環境変数がどのように設定されるかは下記のサイトの下部に書いてあります。

まとめ

この記事では Windows 環境変数で 32bit CPUか 64bit CPU か確実に判断する方法を書きました。ついつい PROCESSOR_ARCHITECTURE だけをみてしまいがちですが、それだけに頼らず PROCESSOR_ARCHITEW6432 も併用するとグッドです。32bit アプリケーション内でも正しく 32bit/64bit を判断できます。

具体的にどの環境変数が使えるのかは、Microsoft の下記のページにて確認してみてください。

以上、 Windows 環境変数で 32bit CPUか 64bit CPU かを判断する方法でした。

ちなみに 64bit Emacs を使いたい場合は自前でビルドすれば良いです。ビルドの仕方は Windows Emacs ビルド方法に書いてあります