流れるまにまに。

自分で学んだこととか、誰かに教わったこととか、誰かに教えたこととか。

【C/C++】OSのバージョン取得

VS2015でとあるアプリを作成してた時、

最初のチェックでOSがXP以外をはじく処理が必要でした。



気にせずいつも通りGetVersionExを使用したら、警告が。。。


1>hoge.cpp(57): warning C4996: 'GetVersionExW': が古い形式として宣言されました。

1> c:\program files (x86)\windows kits\8.1\include\um\sysinfoapi.h(442): note: 'GetVersionExW' の宣言を確認してください



だそうです。

解決法として、「"VersionHelpers.h" に定義されたAPIを使ってくれ」とのこと。

但し、Visual Studio 2013若しくはWindows SDK 8.1にしか上記のヘッダファイルが入っていないと。





なんと不親切な(´・ω・`)







最悪

#pragma warning(disable: 4996)

を追加すればwarningは出ないけど、かっちょ悪い。

ちなみにVS2013だとこれしないとビルドも通らないらしいです。



とりあえず書き換え



昔の
OSVERSIONINFO OSver;

OSver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

GetVersionEx(&OSver);

if (OSver.dwMajorVersion <= 5) {

   MessageBox(_T("XP以前のOSでは使用できません"), _T("OSチェック"), MB_OK);

   break;

}



↓ ↓ ↓



新しいの
#include <VersionHelpers.h>



if (!IsWindowsVistaOrGreater()) {

   MessageBox(_T("この機能はXP以前のOSでは使用できません"), _T("OSチェック"), MB_OK);

   break;

}





なんとなくすっきりしたけど、「OSが7かXP以外は対応しない」とかの条件だとめんどそうだなぁ。

一応"VersionHelpers.h"のAPIメモ





API TRUE判定
IsWindowsXPOrGreater() XP以上
IsWindowsXPSP1OrGreater() XP SP1以上(SP2,SP3も同様にある)
IsWindowsVistaOrGreater() Vista以上
IsWindowsVistaSP1OrGreater() Vista SP1以上(SP2も同様にある)
IsWindows7OrGreater() 7以上
IsWindows7SP1OrGreater() 7 SP1以上
IsWindows8OrGreater() 8以上
IsWindows8Point1OrGreater() 8.1以上
IsWindowsServer() windows serverである


あと、よく忘れるからOSのバージョンメモ。
PlatformIDが1のものは使わないから必要になったら調べる。


OS Majorver Minorver
Windows NT 3.x 3 -
Windows NT 4.0 4 0
Windows 2000 5 0
Windows XP 5 1
WinServer 2003 / WinServer 2003 R2 5 2
Windows Vista / Windows Server 2008 6 0
Windows 7 / Windows Server 2008 R2 6 1
Windows 8 6 2
Windows 8.1 6 3
Windows 10 10 0