直接来干货,说到获取Windows版本,在XP和windows7时代,通常使用的做法如下:

    OSVERSIONINFOEX os; os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX); if(GetVersionEx((OSVERSIONINFO *)&os)) {double i = os.dwMajorVersion + os.dwMinorVersion * 0.1;if(i < 6)           //WIN7以下的系统//do something....}

这里其实是通过os.dwMajorVersion和os.dwMinorVersion来判断版本号的,XP的版本号是5.1,win7是6.1。
本身这种方法也没什么问题,但是到了win8和win10时代,抓瞎了,通过这种方式获取出来的版本号,win7及以上都是6.1了,于是微软告诉你,我们提供了新的API来识别版本号,这个API存在于windowsSDK8.1里面,新的API的名字叫:
IsWindowsXPOrGreater();
IsWindowsXPSP1OrGreater();
IsWindowsXPSP2OrGreater();
IsWindowsXPSP3OrGreater();
IsWindowsVistaOrGreater();
IsWindows7OrGreater();
IsWindows7SP1OrGreater();
IsWindows8OrGreater();
……..
从名字上来看,确实通俗易懂,使用起来非常方便,这些API都存在于VersionHelpers.h这个头文件里面,加入就可以调用了,然而,你以为这样就完了?太天真了!这个头文件在XP下根本无法调用,也就是说,如果你想你的程序可以在XP下运行,根本就不能使用这些API!编译的时候就会报错,如下:

fatal error C1083: 无法打开包括文件: “VersionHelpers.h”: No such file or directory

怎么办?别急,我们继续往下看,分析下新的API到底是调用的什么函数,通过查看SDK,发下:

IsWindows7OrGreater()
{return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0);   //调用的IsWindowsVersionOrGreater函数
}IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };DWORDLONG        const dwlConditionMask = VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),VER_MINORVERSION, VER_GREATER_EQUAL),VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);osvi.dwMajorVersion = wMajorVersion;osvi.dwMinorVersion = wMinorVersion;osvi.wServicePackMajor = wServicePackMajor;return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}   //调用的VerifyVersionInfoW函数//

再查VerifyVersionInfoW,发现Windows7.1和windows8.1的SDK均包含这个函数,也就是说,可以直接通过调用这个函数来实现同样的功能。(此函数只能通过入参来判断当前的Windows版本是否和输入的参数需要的版本值一致,返回为BOOL类型)

这个函数的详细参数和用法就参见微软的官方说明了:
VerifyVersionInfo function

这里给出一个调用示例:

OSVERSIONINFOEXW osvi = {0};
DWORDLONG dwlConditionMask = 0;
ZeroMemory(&osvi, sizeof(osvi));
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = 6;  //win主版本号
osvi.dwMinorVersion = 1;  //次版本号
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);if(::VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask))  //判断返回值是否为win7,返回真为win7,否则返回0//do something...else  //do something...

这里给出主流版本的主版本号和此版本号对照:


Operating system Version number
Windows 10 10.0*
Windows Server 2016 10.0*
Windows 8.1 6.3*
Windows Server 2012 R2 6.3*
Windows 8 6.2
Windows Server 2012 6.2
Windows 7 6.1
Windows Server 2008 R2 6.1
Windows Server 2008 6.0
Windows Vista 6.0
Windows Server 2003 R2 5.2
Windows Server 2003 5.2
Windows XP 64-Bit Edition 5.2
Windows XP 5.1
Windows 2000 5.0

VC++获取不同Windows版本的方法相关推荐

  1. win7 查看php版本信息,window_Windows系统版本怎么看?2种查看windows版本的方法介绍,前段时间微软正式开始向Win7和 - phpStudy...

    Windows系统版本怎么看?2种查看windows版本的方法介绍 前段时间微软正式开始向Win7和Win8用户推送免费Win10更新提示,不过很多电脑用户表示没有收到,这主要由于目前Win10推送主 ...

  2. ffmpeg windows版本交叉编译方法

    写在前面 FFmpeg是一个开源且跨平台的音视频解决方案,集采集.转码.流式化为一身,项目的libavcodec编解码模块和libavformat媒体格式模块,支持非常非常丰富的编解码格式和容器封装格 ...

  3. VC获取其它程序窗口焦点方法 AttachThreadInput的用法

    1.不同线程的处理方法 如何在2K/xp下使窗口获取焦点 //捕捉并设置当前焦点窗口为我们的窗口 AttachThreadInput(     GetWindowThreadProcessId(    ...

  4. VC++获取Widnows操作系统版本(附源码)

    VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从 ...

  5. 彻底解决python中jupyter画图matplotlib的中文显示问题。Mac版本和Windows版本

    jupyter使用matplotlib进行画图会面临中文无法显示的问题,导致这样的原因是没有配置对应的中文字体,所以无法在画图时显示中文. Windows版本解决方法 在Window中,采用以下代码 ...

  6. 笔记1:VC获取系统时间的方法

    笔记1:VC 获取系统时间的方法 推荐的获取方法 获取时间方法种类 各种获取时间方法详解 方法1:time_t变量 和 time(time_t*)方法 方法2:system(" time&q ...

  7. js获取用户的操作系统和浏览器版本的方法

     让IE支持placeholder属性 通过window.location获得URL的信息 js获取用户的操作系统和浏览器版本的方法 2013-07-17 15:12:11|  分类: 工作 |  ...

  8. Windows服务器下升级PHP版本的方法

    这篇文章主要介绍了Windows服务器下升级PHP版本的方法,需要的朋友可以参考下 要升级PHP,我们首先得下载一个自动安装PHP组件到IIS中的软件,推荐的是星外公司开发的PHP安装包,我们可以到他 ...

  9. 编写测试:VC下获取文件大小的4种方法

    代码参考自lailx的博客:获取文件大小的4种方法(http://www.cnblogs.com/lailx/archive/2011/11/20/2256550.html) 1 // TestGet ...

最新文章

  1. 学习笔记(五)——JavaScript(二)
  2. 用c语言做教学课程安排,C语言入门课程安排
  3. 解决安装完ubuntu登陆无root账户问题
  4. 各大型网站架构分析收集Z
  5. python数据分析与应用
  6. SQL 查询语句总是先执行 SELECT?
  7. lua的面向对象编程,封装,继承,多态的实现
  8. linux权限746,linux文件权限学习笔一
  9. dedecms织梦最新0day
  10. 数仓主题表怎么设计_陶瓷企业展厅设计主题风格怎么确定?
  11. bootstraptable导出excel独立使用_JavaWeb系列之-一小时搞定POI导出Excel
  12. Spark : ContextCleaner清理器
  13. 基于JAVA+SpringMVC+Mybatis+MYSQL的企业通用门户网站官网
  14. eclipse开发servlet,HttpServletRequest报红叉解决方案
  15. 虚拟机中利用qemu调试跟踪linux内核
  16. CentOS 设置chrome浏览器桌面图标
  17. 合天网安实验室CTF-基础50-0x01
  18. Newline required at end of file but not found.
  19. [GridView]在 RowCommand事件中,自订的Button 如何取出某一列的索引值(RowIndex)
  20. resilience4j是什么?

热门文章

  1. Qmail系统完整篇
  2. 解决vue项目在IE浏览器打不开的问题
  3. 辉光管升压电路理论,让USB升压170V
  4. Struts2.0.11升级到2.5.30
  5. 优秀人才有没有什么共同的特质可供识别?“Stay young”的特质,这种人基本没有到天花板。...
  6. 云服务器 ipv6,开通IPv6
  7. 数据包结构(IVI,NID,CTL,TTL,SEQ,SRC,DST,TransPDU,NetMIC)
  8. vue精通之路:掌握这42个Vue知识点,你将成为大shen
  9. MUI学习笔记之图片上传和预览
  10. 数字编码电位器c语言,数字电位器x9c103应用电路