Win10获取系统版本号GetVersionEx

开发Win32程序时, 有时候需要获取系统版本号,以便判断用户在使用软件时的系统。发现GetVersionEx获取的系统版本号是错的, win10以后的系统获取到的一直是版本号6.2.x,正确的应该是10.x.x什么情况?

查找资料后发现,Windows 8.1, Win10之后,通过GetVersion and GetVersionEx 方法获取WIndows操作系统版本号的功能需要添加manifest文件后才能查找到

实操步骤

1.在项目文件夹里添加一个xxx.manifest文件
内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <asmv3:application>
      <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
        <dpiAware>false</dpiAware>
      </asmv3:windowsSettings>
    </asmv3:application>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!-- Windows 10 and Windows 11 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
        </application>
    </compatibility>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <!--
                  UAC settings:
                  - app should run at same integrity level as calling process
                  - app does not need to manipulate windows belonging to
                    higher-integrity-level processes
                  -->
                <requestedExecutionLevel
                    level="asInvoker"
                    uiAccess="false"
                />   
            </requestedPrivileges>
        </security>
    </trustInfo>
 </assembly>

2.在项目属性-》清单工具-》输入和输出-》附加清单文件 里增加xxx.manifest文件

$(ProjectDir)os_version.manifest
image.png

测试代码:


wstring OS::GetOsVer(int& major_ver, int& minor_ver) {
    wstring os_name;
    wstring ret;
    OSVERSIONINFOEX osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    DWORD dwMajorVersion, dwMinorVersion, dwPlatformID;
    BOOL flag = (BOOL)GetVersionEx((OSVERSIONINFO *)&osvi);
    if (!flag) return L"";
    
    //visit 6.0,win7-6.1,win8 6.2, win8.1 6.3,   win10有BUG,得到的是6.2(添加manifest文件可解决)
    major_ver = osvi.dwMajorVersion;
    minor_ver = osvi.dwMinorVersion;
    dwPlatformID = osvi.dwPlatformId;

    if (GetVersionEx((LPOSVERSIONINFO)&osvi)) {
        // 根据主版本号和次版本号来判断操作系统
        if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) {
            os_name = L"Windows XP ";// Windows XP
        }
        else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) {
            os_name = L"Windows 2000"; // Windows 2000
        }
        else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) {
            os_name = L"Windows Vista"; // Windows Vista
        }
        else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1) {
            os_name = L"Windows 7"; // Windows 7
        }
        else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2) {
            os_name = L"Windows 8"; // Windows 8
        }
        else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3) {
            os_name = L"Windows 8.1"; // Windows 8.1
        }
        else if (osvi.dwMajorVersion == 10 && osvi.dwBuildNumber < 22000) {
            os_name = L"Windows 10"; // Windows 10
        }
        else if (osvi.dwMajorVersion >= 10 && osvi.dwBuildNumber >= 22000) {
            // 对于 Windows Server 和更高版本(例如: Win11)
            os_name = L"Windows 11";
        }
    }
    return !os_name.empty() ? os_name : L"Unknown Operating System";


}

正确获取到版本号


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容