7080 + 1

ゲームプログラミングの記事を書いてます。

OSのバージョンを調べる(VerifyVersionInfo())

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_MAJORVERSIONVER_MINORVERSIONを比較します。比較の仕方がVER_GREATER_EQUAL、要は比較演算子<=で比較するわけです。

つまり、メジャーバージョン、マイナーバージョンの比較は<=で比較するように設定します。これをマイナーバージョンだけは==で比較、とか自由に設定できるわけです。

さて、それではVerifyVersionInfo()を実際に使ってみるとこうなります。

if( VerifyVersionInfo( &OSver, VER_MAJORVERSION | VER_MINORVERSION, condition))
{
    // Windows8.0以上の時の処理
}
else
{
    // それ以外の処理
}

第二引数で、何と何を比較するのかをパイプ演算子で設定します。 これを正しく設定しないと、先程用意したconditionの設定が無駄になります。 先程作ったOSVerconditionの設定だと、自分の使っているOSがWindows8.0以上なら trueを、それ以外ならfalseを返します。