Windows のバージョンを取得するための API として GetVersion
, GetVersionEx
が用意されていますが、Windows 8.1 以降実質的に使えなくなっています。バージョンに依存した処理を書かないようにというマイクロソフトのメッセージだと思いますが、それでもチェックしたい場面もあると思います。
いくつか方法はありますが、ここでは一番単純と思われる RtlGetVersion を使って取得します。
#include <stdio.h>
#include <Windows.h>
void GetWindowsVersion(DWORD* majorVersion, DWORD* minorVersion, DWORD* buildNumber) {
DWORD major = 0;
DWORD minor = 0;
DWORD build = 0;
auto ntdll = LoadLibraryExW(L"ntdll.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
if (ntdll != nullptr) {
using RtlGetVersion = NTSTATUS(WINAPI*)(PRTL_OSVERSIONINFOW lpVersionInformation);
auto rtlGetVersion = reinterpret_cast<RtlGetVersion>(GetProcAddress(ntdll, "RtlGetVersion"));
if (rtlGetVersion != nullptr) {
RTL_OSVERSIONINFOW versionInfo{};
versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
rtlGetVersion(&versionInfo);
major = versionInfo.dwMajorVersion;
minor = versionInfo.dwMinorVersion;
build = versionInfo.dwBuildNumber;
}
FreeLibrary(ntdll);
}
if (majorVersion != nullptr) *majorVersion = major;
if (minorVersion != nullptr) *minorVersion = minor;
if (buildNumber != nullptr) *buildNumber = build;
}
int main()
{
DWORD majorVersion = 0;
DWORD minorVersion = 0;
DWORD buildNumber = 0;
GetWindowsVersion(&majorVersion, &minorVersion, &buildNumber);
printf("majorVersion:%d, minorVersion:%d, buildNumber:%d\n", majorVersion, minorVersion, buildNumber);
}