Windows にて使っているPCが 32bit なのか 64bit なのかを調べるときの落とし穴について説明します。


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

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

1
2
c:\>echo %PROCESSOR_ARCHITECTURE%
x86

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

1
2
c:\>echo %PROCESSOR_ARCHITECTURE%
AMD64

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

1
2
3
4
5
6
7
8
9
@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を実行してみてください。

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

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

1
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を退避してくれています。

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

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

1
PROCESSOR_ARCHITEW6432 is AMD64.

ちなみに PROCESSOR_ARCHITEW6432 はWOW64のみで有効になりますのでご注意を。 32bit/64bitにてどの環境変数がどのように設定されるかはマイクロソフト社のサイトWOW64 実装の詳細の下の方に書いてあります。

まとめ

この記事では Windows 環境変数で 32bit CPUか 64bitCPU か確実に判断する方法を書きました。 ついついPROCESSOR_ARCHITECTURE だけをみてしまいがちですが、それだけに頼らずPROCESSOR_ARCHITEW6432 も併用するとグッドです。 32bitアプリケーション内でも正しく 32bit/64bit を判断できます。 具体的にどの環境変数が使えるのかは、MicrosoftのWOW64 実装の詳細のサイトを確認してください。 以上、 Windows環境変数で 32bit CPUか 64bit CPU かを判断する方法でした。