OSのバージョン取得方法には、GetVersionEx()
と、VerifyVersionInfo()
の2つがあります。
しかし両者には違いがあります。
前者は現在自分の使っているOSのバージョンを知ることが出来ます。
後者は現在自分の使っているOSと、引数で指定したバージョンを比較します。
言葉だけではわかりにくいですね。でも安心してください。前者はWindows8.1では使えません。
古い形式だとコンパイラに怒られてしまいます。
私はなんとか前者が使えないかと四苦八苦してました。
なので、Windows8.1の人は何も考えずにVarifyVersionInfo()
を使いましょう。
GetVersionEx()
の使い方はご自分でお調べください。
それでは、まずはVerifyVersionInfo()
を使うための準備です。
OSVERSIONINFOEX OSver; ULONGLONG condition = 0; OSver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); OSver.dwMajorVersion = 6; OSver.dwMinorVersion = 2; VER_SET_CONDITION( condition, VER_MAJORVERSION, VER_GREATER_EQUAL); VER_SET_CONDITION( condition, VER_MINORVERSION, VER_GREATER_EQUAL);
OSVERSIONINFOEX
に設定しているのは、この構造体のサイズと、Windowsのバージョン情報です。
このバージョンと、自分の使っているOSのバージョンを比較するわけです。サイズは必ず必要です。
dwMajorVersion
に6、dwMinorVersion
に2を渡しているので、Windows8.0を表しています。
Majorは6のままで、Minorを1にするとWindows7、3にするとWindows8.1を表します。
VER_SET_CONDITION()
というのは、何の値をどのように比較するのか、というのをcondition
に設定しています。
OSVERSIONINFOEX
にはたくさんのメンバがあります。OSのバージョン以外にも、ServicePackのバージョンとか、なんか色々です。で、現在はVER_MAJORVERSION
とVER_MINORVERSION
を比較します。比較の仕方がVER_GREATER_EQUAL
、要は比較演算子の<=
で比較するわけです。
つまり、メジャーバージョン、マイナーバージョンの比較は<=
で比較するように設定します。これをマイナーバージョンだけは==
で比較、とか自由に設定できるわけです。
さて、それではVerifyVersionInfo()
を実際に使ってみるとこうなります。
if( VerifyVersionInfo( &OSver, VER_MAJORVERSION | VER_MINORVERSION, condition)) { // Windows8.0以上の時の処理 } else { // それ以外の処理 }
第二引数で、何と何を比較するのかをパイプ演算子で設定します。
これを正しく設定しないと、先程用意したcondition
の設定が無駄になります。
先程作ったOSVer
とcondition
の設定だと、自分の使っているOSがWindows8.0以上なら
trueを、それ以外ならfalseを返します。