32ビットの実行モジュールが64ビットWindowsで動いているか判定する
ここでは、 IsWow64Process を使う方法を説明します。他にも方法があるかもですけど。
「VC++ x64 判定」とか検索すると、別目的の方法や、ちょっと妖しい情報も混在します。 確かにちょっとヤヤコシイから混乱しやすい。そこ考慮して書いときます。
やりたいのは、VC++で作った64ビットでも32ビットでも動作するアプリの実行中に「これ今、64ビットのWindowsで動作してる?それとも32ビット?」ということが知りたいということですよ。
ここで抑えておきたいポイントは、「32ビットWindowsでも動作するようにビルドされた実行モジュールで知りたい」というところです。64ビットだけで動作するようになっているモジュールは、当たり前ですが32ビットでは動きませんから調べる必要はありません。なので#ifdef _WIN64
とか無意味ですよ。
てことで、話は簡単。以下の関数で判定できます。TRUEが返されたら64ビット環境で動いているということです。
[Windows VC++] Check whether the current process is running on the x64 · GitHub
内容は「kernel32.dllにIsWow64ProcessというAPIがあれば、そいつに聞いてみる。なければ32ビットで実行中」ってことですわ。
GetProcAddressを使っているのは、IsWow64Processが Vista か XP SP2以降にしか存在しないからです。 サポート切れのXPが、まだまだ沢山使われてるみたいなので、念のためってことです。
Xp以前のWindowsをサポートしないなら、以下のように、直接呼び出して問題ありません。
#include <Windows.h> BOOL IsRunningOnX64() { BOOL isRunningOnX64 = FALSE; ::IsWow64Process(GetCurrentProcess(), &isRunningOnX64); return isRunningOnX64; }
というかXp最近シェア伸ばしたらしい。どういうこっちゃ。
いやしかし、
以前、とあるUSBカメラの32ビット用デバイスドライバが、64ビット環境では一部の機能が使えないけど一応使えるってことがありまして。64ビットで、その機能を使うといきなり異常終了しちゃうので、事前に調べる必要があったのです。
で、当時いろんなサイトを参考にしたんだけど、今調べてみると、実はMSDNの「IsWow64Process function(Windows)」に、例として掲載されているコードと、ほぼ同じと気がついた(愕然)。
元はご本尊の情報だったのかあ。まあ、もったいないので書いておきます。
日本語だけで検索してたからこういうことになったのかも。なんか残念。