概要

Windows上でバージョン情報を取得する方法はいろいろありますが主な方法として以下の3種類の方法が考えられます。
API マニフェスト 互換モード 備考
GetVersionEx API 8.1以上を取得時には指定が必要 依存 Windows 95以上又はWindows NT 3.5以上で実行可能
Windows 8.1以降は非推奨だが10でも使用可能
VerfyVersionInfo API 10以上を取得時には指定が必要 非依存 自身のWindowsのバージョンに対して上位か同一か下位といった判定しかできない
Windows 2000以上でのみ実行可能
RtlGetVersion API 非依存 依存 DDK等をインストールしていない場合、ヘッダーファイルおよびライブラリが無い
Windows 2000以上でのみ実行可能
上表のマニフェストはマニフェストにより動作バージョンを明示することを意味します。
マニフェストを指定しない場合、Windows 8.1まで正常な答えが得られました。マニフェストを指定しない場合ではWindows 10ではWindows 8相当の答えが返ってきます。 上表の互換モードはexeファイルのプロパティで互換性で設定できる互換モードです。
このページではGetVersionEx APIについて解説します。
以下に本プログラムを各Windowsで実行した例を示します。
Windows 98 Second Edition Windows 2000 Service Pack 4 Windows XP Service Pack 3 Windows Vista Service Pack 2 Windows 7 Service Pack 1 Windows 8.1 Windows 10

Windowsの内部バージョン一覧

Windowsの内部バージョン一覧を以下に示します。
メンバー NT 3.1
Workstation
NT
3.5Workstation
NT 3.51
Workstation
dwMajorVersion 3 3 3
dwMinorVersion 1 5 51
wProductType 1 1 1

メンバー NT 4.0
Workstation
95 98 98SE me
dwMajorVersion 4 4 4 4 4
dwMinorVersion 0 0 10 10 90
wProductType 1 0 0 0 0

メンバー 2000 XP 2003R2
dwMajorVersion 5 5 5
dwMinorVersion 0 1 2
wProductType 1 1 3

メンバー Vista 7 2008R2 8 8.1 2012 2012R2
dwMajorVersion 6 6 6 6 6 6 6
dwMinorVersion 0 1 1 2 3 2 3
wProductType 1 1 3 1 1 3 3

メンバー 10
dwMajorVersion 10
dwMinorVersion 0
wProductType 1

テスト環境

コンパイラ

Visual C++ 2005 Express
Visual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit

プロジェクトの作成

Win32プロジェクト Windowsアプリケーション

実行環境

Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit
Windows 2000 Professional Service Pack 4(Virtual Box上)
Windows 98 Second Editonl(Virtual Box上)

Windows 98で使用するためにはVisual C++ 2005 Expressでマルチバイトでコンパイルする必要があります。

プログラムソースの概要

最初にOSVERSIONINFO構造体を使用してGetVersionEx APIを呼び出します。
次にOSVERSIONINFOEX構造体を使用してGetVersionEx APIを呼び出し正常に実行できれば、 OSVERSIONINFOEX構造体に取得されたバージョンを表示、 失敗した場合OSVERSIONINFO構造体のバージョンを表示します。
GetVersionEx APIでのOSVERSIONINFO構造体とOSVERSIONINFOEX構造体の区別は、 メンバーdwOSVersionInfoSizeに指定した、構造体サイズで判別されます。
Visual C++ 2013の場合、コンパイル時に「GetVersionExが古い形式として宣言されました」と メッセージが出ますので、#pragma warningで回避しています。

プログラムソース

getversionex.cpp

//       GetVersionEx APIを用いてバージョンを取得
//      Visual C++ 2005/2008/2013       32/64bit

#include <windows.h>
#include <tchar.h>


int WINAPI _tWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,TCHAR* lpsCmdLine, int nCmdShow){
        OSVERSIONINFO ver;
        ver.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
#if 1600<=_MSC_VER   //      Visual C++ 2010以上
        #pragma warning(push)
        #pragma warning(disable : 4996) // GetVersionExが古い形式として宣言されましたを回避
#endif

        GetVersionEx(&ver);

        TCHAR buf[64];
        OSVERSIONINFOEX verex;
        verex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

        if (GetVersionEx((OSVERSIONINFO*)&verex))
                wsprintf(buf, TEXT("プロダクトID %d , メジャー %d , マイナー%d"), verex.wProductType, verex.dwMajorVersion, verex.dwMinorVersion);
        else
                wsprintf(buf, TEXT("メジャー %d , マイナー%d"),  ver.dwMajorVersion, ver.dwMinorVersion);

#if 1600<=_MSC_VER   //      Visual C++ 2010以上
        #pragma warning(pop)
#endif
        MessageBox(0, buf, TEXT("Windows Version"), MB_OK);
        return 0;
}

manifest.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows 10 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>

        </application> 
    </compatibility>
</assembly>

ソースファイルと実行ファイルのダウンロード

ダウンロード getversionex.zip(75.7kByte)
ZIPファイルに含まれるファイル
getversion.cpp          C++ソースファイル
manifest.xml            Windows 7~Windows 10までの動作環境を指定したマニフェストファイル
getversionex.exe        Visual C++ 2013(v120_xp)で上記マニフェストファイルを組み込んで作成した実行ファイル(Windows XP~Windows 10で実行可能)
getversionex2008.exe    Visual C++ 2008で上記マニフェストファイルを組み込んで作成した実行ファイル(Windows 2000~Windows 10で実行可能)
getversionex2005.exe    Visual C++ 2005でマルチバイトで作成した実行ファイル(Windows 98~Windows 8.0で実行可能)