GetVersionEx自Windows 2000起可用,但在Windows 8.1/10上行為發生變化:未聲明清單的應用程序將返回Windows 8版本號(6.2)。現代開發建議使用Version Helpers API(IsWindows10OrGreater等)或RtlGetVersion(內核模式)。
#include
#include
std::wstring GetOSVersionString() {
OSVERSIONINFOEXW osvi = { sizeof(osvi) };
if (!GetVersionExW((OSVERSIONINFOW*)&osvi)) return L"Unknown";
std::wstring version;
switch (osvi.dwPlatformId) {
case VER_PLATFORM_WIN32_NT:
version = L"Windows NT ";
break;
case VER_PLATFORM_WIN32_WINDOWS:
version = L"Windows 9x ";
break;
case VER_PLATFORM_WIN32s:
version = L"Win32s ";
break;
}
// 主版本.次版本.構建號
version += std::to_wstring(osvi.dwMajorVersion) + L"." +
std::to_wstring(osvi.dwMinorVersion) + L"." +
std::to_wstring(osvi.dwBuildNumber);
// 產品類型
if (osvi.dwMajorVersion >= 10) {
if (osvi.wProductType == VER_NT_WORKSTATION)
version += L" (Client)";
else
version += L" (Server)";
}
return version;
}
| 作業系統 | dwMajorVersion | dwMinorVersion | dwBuildNumber |
|---|---|---|---|
| Windows 11 | 10 | 0 | 22000+ |
| Windows 10 | 10 | 0 | 10240~19045 |
| Windows 8.1 | 6 | 3 | 9600 |
| Windows 8 | 6 | 2 | 9200 |
| Windows 7 / Server 2008 R2 | 6 | 1 | 7600/7601 |
| Windows Vista / Server 2008 | 6 | 0 | 6000~6002 |
| Windows XP / Server 2003 | 5 | 1/2 | 2600/3790 |
#include
// 編譯時需Windows SDK 8.1+
if (IsWindows10OrGreater()) { /* Windows 10+ */ }
if (IsWindowsServer()) { /* 服務器版本 */ }
// 需從ntdll.dll動態獲取
typedef LONG (NTAPI *PFN_RtlGetVersion)(PRTL_OSVERSIONINFOW);
PFN_RtlGetVersion pRtlGetVersion = (PFN_RtlGetVersion)
GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetVersion");
RTL_OSVERSIONINFOW rovi = { sizeof(rovi) };
if (pRtlGetVersion && pRtlGetVersion(&rovi) == 0) {
// rovi.dwMajorVersion 等字段真實反映系統版本
}
SELECT Caption, Version, BuildNumber, OSArchitecture
FROM Win32_OperatingSystem
在app.manifest中聲明supportedOS GUID可讓GetVersionEx返回真實版本:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
</application>
</compatibility>