VCLにはWindowsのバージョンを取得する変数や関数が用意されています。
C++Builder XE2以降では専用のTOSVersion構造体が用意されています。
Memo1->Lines->Add(TOSVersion::ToString());
switch (TOSVersion::Architecture) {
case TOSVersion::arIntelX86:
Memo1->Lines->Add("Architecture: IntelX86");
break;
case TOSVersion::arIntelX64:
Memo1->Lines->Add("Architecture: IntelX64");
break;
}
switch (TOSVersion::Platform) {
case TOSVersion::pfWindows:
Memo1->Lines->Add("Platform: Windows");
break;
case TOSVersion::pfMacOS:
Memo1->Lines->Add("MacOS");
break;
}
Memo1->Lines->Add("Build: " + IntToStr(TOSVersion::Build));
Memo1->Lines->Add("Major: " + IntToStr(TOSVersion::Major));
Memo1->Lines->Add("Minor: " + IntToStr(TOSVersion::Minor));
Memo1->Lines->Add("Name: " + TOSVersion::Name);
Memo1->Lines->Add("Service Pack - Major: " + IntToStr(TOSVersion::ServicePackMajor));
Memo1->Lines->Add("Service Pack - Minor: " + IntToStr(TOSVersion::ServicePackMinor));
TOSVersion.Check関数やSysUtils.CheckWin32Version関数を使うと、実行環境が特定のバージョン(またはそれ以上)であるかどうかを確かめることができます。
static bool __fastcall Check(int AMajor);
static bool __fastcall Check(int AMajor, int AMinor);
static bool __fastcall Check(int AMajor, int AMinor, int AServicePackMajor);
Boolean CheckWin32Version(int AMajor, int AMinor = 0);
渡された引数と同じまたはそれ以上のバージョンの時はtrueを返します。
使用例
if (TOSVersion::Check(5, 1, 3))
ShowMessage("Windows XP SP3 以降");
else
ShowMessage("Windows XP SP3 以前");
メジャーバージョンはTOSVersion.MajorやSysUtils.Win32MajorVersion変数で取得できます。
int majorVersion = TOSVersion::Major;
int majorVersion = Win32MajorVersion;
マイナーバージョンはTOSVersion.MinorやSysUtils.Win32MinorVersion変数で取得できます。
int minorVersion = TOSVersion::Minor;
int minorVersion = Win32MinorVersion;
ビルドレベルはTOSVersion.BuildやSysUtils.Win32BuildNumber変数で取得できます。
int buildNumber = TOSVersion::Build;
int buildNumber = Win32BuildNumber;
サービスパックのメジャーバージョン番号はTOSVersion.ServicePackMajor、 サービスパックのマイナーバージョン番号はTOSVersion.ServicePackMinorで取得できます。
int major = TOSVersion::ServicePackMajor;
int minor = TOSVersion::ServicePackMinor;
最新のサービスパックの名前はSysUtils.Win32CSDVersion変数で取得できます。
UnicodeString csdVersion = Win32CSDVersion;
プロセッサアーキテクチャはTOSVersion.Architectureで取得できます。
switch (TOSVersion::Architecture) {
case TOSVersion::arIntelX86:
ShowMessage("Intel x86");
break;
case TOSVersion::arIntelX64:
ShowMessage("Intel x64 ");
break;
}
プラットフォームはTOSVersion.Platformで取得できます。
switch (TOSVersion::Platform) {
case TOSVersion::pfWindows:
ShowMessage("Windows");
break;
case TOSVersion::pfMacOS:
ShowMessage("MacOS");
break;
}
Win32プラットフォームの型はSysUtils.Win32Platform変数で取得できます。
switch (Win32Platform) {
case VER_PLATFORM_WIN32s:
ShowMessage("Win32s");
break;
case VER_PLATFORM_WIN32_WINDOWS:
ShowMessage("Windows 95");
break;
case VER_PLATFORM_WIN32_NT:
ShowMessage("Windows NT");
break;
}
Windowsの各バージョンの値は次のようになっています。
VCLを使わない場合は、GetVersionEx APIを使用することでバージョン情報を取得できます。
#include <tchar.h>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
OSVERSIONINFO info;
ZeroMemory(&info, sizeof(OSVERSIONINFO));
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx(&info)) {
puts("error");
return 0;
}
switch (info.dwPlatformId) {
case VER_PLATFORM_WIN32s:
puts("Win32s");
break;
case VER_PLATFORM_WIN32_WINDOWS: // Windows 9x系
switch (info.dwMinorVersion) {
case 0:
puts("Windows 95");
break;
case 10:
puts("Windows 98");
break;
case 90:
puts("Windows Me");
break;
default:
puts("Windows 95 family");
break;
}
break;
case VER_PLATFORM_WIN32_NT: // Windows NT系
switch (info.dwMajorVersion) {
case 3:
puts("Windows NT 3");
break;
case 4:
puts("Windows NT 4");
break;
case 5:
switch (info.dwMinorVersion) {
case 0:
puts("Windows 2000");
break;
case 1:
puts("Windows XP");
break;
case 2:
puts("Windows Server 2003");
break;
default:
puts("Windows NT family");
break;
}
break;
case 6:
switch (info.dwMinorVersion) {
case 0:
puts("Windows Vista");
break;
case 1:
puts("Windows 7");
break;
}
}
}
puts(info.szCSDVersion);
return 0;
}