概要

Windows上でバージョン情報を取得する方法はいろいろありますが主な方法として以下の3種類の方法が考えられます。
APIマニフェスト互換モード備考
GetVersionEx API8.1以上を取得時には指定が必要依存Windows 95以上又はWindows NT 3.5以上で実行可能
Windows 8.1以降は非推奨だが10でも使用可能
VerfyVersionInfo API10以上を取得時には指定が必要非依存自身の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で実行可能)