淑昊柠 发表于 2018-6-21 10:58:11

VerifyVersionInfo获取WINDOWS操作系统版本

  转载地址: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版本判断:
   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]
查看完整版本: VerifyVersionInfo获取WINDOWS操作系统版本