设为首页 收藏本站
查看: 694|回复: 0

[经验分享] VerifyVersionInfo获取WINDOWS操作系统版本

[复制链接]

尚未签到

发表于 2018-6-21 10:58:11 | 显示全部楼层 |阅读模式
  转载地址:http://blog.csdn.net/mynote/article/details/39135651
  FreeEIM在vs2013下,使用GetVersionEx来获取操作系统的版本信息,vs报错error: `GetVersionEx‘ declared deprecated,于是去msdn查看了一下,推荐使用VerifyVersionInfo来进行版本判断,官方解释是因爲一般只要判断是否windows的版本大于某个特定的版本号。
  于是我查看了一下VerifyVersionInfo,这个函数的使用就是针对特定的版本信息字段进行条件判断。
  参数1:OSVERSIONINFOEX  这个结构里保存用户提供的系统版本信息,例如major version,minor version等,这些会用作和系统实际信息进行比较。
  参数2:dwTypeMask                类型掩码,是由一些宏进行或操作之后的结果,例如 VER_MAJORVERSION | VER_MINORVERSION 告诉函数major version和minor version需要进行比较,如果只定义VER_MAJORVERSION那么就只会判断major version字段。
  参数3:dwlConditionMask        条件掩码,目的是向用户提供丰富的判断条件设置,各个字段都有相应的判断条件设置,通过VER_SET_CONDITION宏进行条件设置。
  我写了一段代码进行windows版本判断:
  [cpp] view plaincopyprint?
  01.BOOL isWinVersionEqualTo(DWORD dwMajorVersion, DWORD dwMinorVersion)
  02.{
  03.    OSVERSIONINFOEX osvi;
  04.    DWORDLONG dwlConditionMask = 0;
  05.
  06.    //Initialize the OSVERSIONINFOEX structure.

  07.    ZeroMemory(&osvi,>
  08.    osvi.dwOSVersionInfoSize =>  09.    osvi.dwMajorVersion = dwMajorVersion;
  10.    osvi.dwMinorVersion = dwMinorVersion;
  11.
  12.    //Initialize the condition mask.
  13.    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
  14.    VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);
  15.
  16.    return VerifyVersionInfo(
  17.        &osvi,
  18.        VER_MAJORVERSION | VER_MINORVERSION,
  19.        dwlConditionMask
  20.        );
  21.}
  22.
  23.BOOL isWinVersionGreaterThan(DWORD dwMajorVersion, DWORD dwMinorVersion)
  24.{
  25.    OSVERSIONINFOEX osvi;
  26.    DWORDLONG dwlConditionMask = 0;
  27.
  28.    //Initialize the OSVERSIONINFOEX structure.

  29.    ZeroMemory(&osvi,>
  30.    osvi.dwOSVersionInfoSize =>  31.    osvi.dwMajorVersion = dwMajorVersion;
  32.    osvi.dwMinorVersion = dwMinorVersion;
  33.
  34.    //system major version > dwMajorVersion
  35.    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER);
  36.    if (VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask))
  37.        return TRUE;
  38.
  39.    //sytem major version = dwMajorVersion && minor version > dwMinorVersion
  40.    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
  41.    VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER);
  42.
  43.    return VerifyVersionInfo(
  44.        &osvi,
  45.        VER_MAJORVERSION | VER_MINORVERSION,
  46.        dwlConditionMask
  47.        );
  48.}
  49.
  50.BOOL isWinVersionLessThan(DWORD dwMajorVersion, DWORD dwMinorVersion)
  51.{
  52.    OSVERSIONINFOEX osvi;
  53.    DWORDLONG dwlConditionMask = 0;
  54.
  55.    //Initialize the OSVERSIONINFOEX structure.

  56.    ZeroMemory(&osvi,>
  57.    osvi.dwOSVersionInfoSize =>  58.    osvi.dwMajorVersion = dwMajorVersion;
  59.    osvi.dwMinorVersion = dwMinorVersion;
  60.
  61.    //system major version < dwMajorVersion
  62.    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_LESS);
  63.    if (VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask))
  64.        return TRUE;
  65.
  66.    //sytem major version = dwMajorVersion && minor version < dwMinorVersion
  67.    dwlConditionMask = 0;
  68.    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
  69.    VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_LESS);
  70.
  71.    return VerifyVersionInfo(
  72.        &osvi,
  73.        VER_MAJORVERSION | VER_MINORVERSION,
  74.        dwlConditionMask
  75.        );
  76.}
  77.
  78.void initializeWindowsVersion(void)
  79.{
  80.    /* Ancient Windows */
  81.    if (IsWinVersionLessThan(5, 1)) {
  82.        WindowsVersion = WINDOWS_ANCIENT;
  83.    }
  84.    /* Windows XP */
  85.    else if (IsWinVersionEqualTo(5, 1)) {
  86.        WindowsVersion = WINDOWS_XP;
  87.    }
  88.    /* Windows Server 2003 */
  89.    else if (IsWinVersionEqualTo(5, 2)) {
  90.        WindowsVersion = WINDOWS_SERVER_2003;
  91.    }
  92.    /* Windows Vista, Windows Server 2008 */
  93.    else if (IsWinVersionEqualTo(6, 0)) {
  94.        WindowsVersion = WINDOWS_VISTA;
  95.    }
  96.    /* Windows 7, Windows Server 2008 R2 */
  97.    else if (IsWinVersionEqualTo(6, 1)) {
  98.        WindowsVersion = WINDOWS_7;
  99.    }
  100.    /* Windows 8 */
  101.    else if (IsWinVersionEqualTo(6, 2)) {
  102.        WindowsVersion = WINDOWS_8;
  103.    }
  104.    else if (isWinVersionGreaterThan(6,2)) {
  105.        WindowsVersion = WINDOWS_NEW;
  106.    }
  107.}
  BOOL isWinVersionEqualTo(DWORD dwMajorVersion, DWORD dwMinorVersion)
  {
  OSVERSIONINFOEX osvi;
  DWORDLONG dwlConditionMask = 0;
  //Initialize the OSVERSIONINFOEX structure.

  ZeroMemory(&osvi,>
  osvi.dwOSVersionInfoSize =>  osvi.dwMajorVersion = dwMajorVersion;
  osvi.dwMinorVersion = dwMinorVersion;
  //Initialize the condition mask.
  VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
  VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);
  return VerifyVersionInfo(
  &osvi,
  VER_MAJORVERSION | VER_MINORVERSION,
  dwlConditionMask
  );
  }
  BOOL isWinVersionGreaterThan(DWORD dwMajorVersion, DWORD dwMinorVersion)
  {
  OSVERSIONINFOEX osvi;
  DWORDLONG dwlConditionMask = 0;
  //Initialize the OSVERSIONINFOEX structure.

  ZeroMemory(&osvi,>
  osvi.dwOSVersionInfoSize =>  osvi.dwMajorVersion = dwMajorVersion;
  osvi.dwMinorVersion = dwMinorVersion;
  //system major version > dwMajorVersion
  VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER);
  if (VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask))
  return TRUE;
  //sytem major version = dwMajorVersion && minor version > dwMinorVersion
  VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
  VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER);
  return VerifyVersionInfo(
  &osvi,
  VER_MAJORVERSION | VER_MINORVERSION,
  dwlConditionMask
  );
  }
  BOOL isWinVersionLessThan(DWORD dwMajorVersion, DWORD dwMinorVersion)
  {
  OSVERSIONINFOEX osvi;
  DWORDLONG dwlConditionMask = 0;
  //Initialize the OSVERSIONINFOEX structure.

  ZeroMemory(&osvi,>
  osvi.dwOSVersionInfoSize =>  osvi.dwMajorVersion = dwMajorVersion;
  osvi.dwMinorVersion = dwMinorVersion;
  //system major version < dwMajorVersion
  VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_LESS);
  if (VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask))
  return TRUE;
  //sytem major version = dwMajorVersion && minor version < dwMinorVersion
  dwlConditionMask = 0;
  VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
  VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_LESS);
  return VerifyVersionInfo(
  &osvi,
  VER_MAJORVERSION | VER_MINORVERSION,
  dwlConditionMask
  );
  }
  void initializeWindowsVersion(void)
  {
  /* Ancient Windows */
  if (IsWinVersionLessThan(5, 1)) {
  WindowsVersion = WINDOWS_ANCIENT;
  }
  /* Windows XP */
  else if (IsWinVersionEqualTo(5, 1)) {
  WindowsVersion = WINDOWS_XP;
  }
  /* Windows Server 2003 */
  else if (IsWinVersionEqualTo(5, 2)) {
  WindowsVersion = WINDOWS_SERVER_2003;
  }
  /* Windows Vista, Windows Server 2008 */
  else if (IsWinVersionEqualTo(6, 0)) {
  WindowsVersion = WINDOWS_VISTA;
  }
  /* Windows 7, Windows Server 2008 R2 */
  else if (IsWinVersionEqualTo(6, 1)) {
  WindowsVersion = WINDOWS_7;
  }
  /* Windows 8 */
  else if (IsWinVersionEqualTo(6, 2)) {
  WindowsVersion = WINDOWS_8;
  }
  else if (isWinVersionGreaterThan(6,2)) {
  WindowsVersion = WINDOWS_NEW;
  }
  }
  这段代码用来对windows版本进行判断,感觉比用GetVersionEx来的麻烦很多... 可能是没发现别的方法.
  ///////////////////////////////////////////////////////////////////////////////////////////根据余不欢的评论,我check了versionhelpers////////////////////////////////////////////////////////////////////////
  Microsoft已经提供了众多的版本检查函数,例如IsWindowsXPOrGreater,IsWindows7OrGreater...

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-528684-1-1.html 上篇帖子: windows DHCP 服务器迁移技术文档 下篇帖子: Windows Azure Pack与SCVMM标签解析分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表