Windows にて使っているPCが 32bit なのか 64bit なのかを調べるときの落とし穴について説明します。
よくあるパタン:環境変数 PROCESSOR_ARCHITECTURE
Windows では環境変数 PROCESSOR_ARCHITECTUREにより、プロセッサの種類を知ることができます。
環境変数PROCESSOR_ARCHITECTUREは、例えば、32ビットであれば"x86"、64ビットであれば"AMD64"もしくは"IA64"といった値になります。
下記は32bit CPU にてDOS窓で下記のようにPROCESSOR_ARCHITECTURE変数を表示した場合の例です。
| |
また、 64 bit CPU だとこうなります(IA64と表示されるかも)。
| |
バッチファイル内で分岐させるなら下記のようになりますね。
| |
ここまでは特に問題ないですね、想定通り。
環境変数を PROCESSOR_ARCHITECTURE をアプリから表示させてみる
ここでちょっとした実験をします。面倒な人は軽く読み流してください。
この便利な環境変数 PROCESSOR_ARCHITECTURE ですが、弱点があります。
例えば64bit CPU をお使いで、かつ、下記の Windows 向け Emacsを使っている人は簡単な実験をしてみてください。
scratch バッファで下記のelispを実行してみてください。
| |
AMD64 か IA64 が表示されそうなものですが、下記のように 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を退避してくれています。
| |
実行結果は下記のようになるはずです。
| |
ちなみに PROCESSOR_ARCHITEW6432 はWOW64のみで有効になりますのでご注意を。
32bit/64bitにてどの環境変数がどのように設定されるかはマイクロソフト社のサイトWOW64 実装の詳細の下の方に書いてあります。
まとめ
この記事では Windows 環境変数で 32bit CPUか 64bitCPU か確実に判断する方法を書きました。
ついついPROCESSOR_ARCHITECTURE だけをみてしまいがちですが、それだけに頼らずPROCESSOR_ARCHITEW6432 も併用するとグッドです。
32bitアプリケーション内でも正しく 32bit/64bit を判断できます。
具体的にどの環境変数が使えるのかは、MicrosoftのWOW64 実装の詳細のサイトを確認してください。
以上、 Windows環境変数で 32bit CPUか 64bit CPU かを判断する方法でした。