首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

GetVersionEx獲取Windows版本信息詳解

     編輯:VC 教學

API演進與兼容性

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;
}

版本號對照表(常見版本)

作業系統dwMajorVersiondwMinorVersiondwBuildNumber
Windows 1110022000+
Windows 1010010240~19045
Windows 8.1639600
Windows 8629200
Windows 7 / Server 2008 R2617600/7601
Windows Vista / Server 2008606000~6002
Windows XP / Server 200351/22600/3790

現代替代方案

1. Version Helpers API (推薦用戶態)

#include 
// 編譯時需Windows SDK 8.1+
if (IsWindows10OrGreater()) { /* Windows 10+ */ }
if (IsWindowsServer()) { /* 服務器版本 */ }

2. RtlGetVersion (內核驅動/無清單應用)

// 需從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 等字段真實反映系統版本
}

3. WMI查詢 (跨機器/腳本)

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>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved