微软在windows 10的版本号获取上留下一个坑,如果用GetVersionEx获取版本号,则获取到的是6.2.9200

官方有如下说明

[GetVersionEx may be altered or unavailable for releases after Windows 8.1. Instead, use the Version Helper APIs]

也就是8.1开始就不正常了,那么如何正常判断版本号呢,下面列举一下可用的三个方法吧

  1.manifest文件加上compatibility节点

<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}"/><!-- Windows Vista --><supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!-- Windows 7 --><supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- Windows 8 --><supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/></application> </compatibility>

但是这种方法局限性比较大,如果只是开发静态库什么的,就不可行

2.通过系统文件来读取

这是win10 kernel32.dll文件的属性信息,看到没有,这里有版本信息

可以通过GetFileVersionInfo 来获取,具体实现就不讲了

3.使用微软推荐的Version Helper APIs来获取

函数是这个样子的:

IsWindows10OrGreater()

但是Requirements是这样的:

Minimum supported client

Windows 10 Technical Preview [desktop apps only]

Minimum supported server

Windows Server Technical Preview [desktop apps only]

Header

VersionHelpers.h (include Windows.h)

Library

Kernel32.lib;Ntdll.lib

DLL

Kernel32.dll;Ntdll.dll

需要windows 10以后才可用,老版本的系统怎么用呢
      是不是只有win10下的kernel32.dll才导出了这个函数呢,是不是需要动态获取这个函数来判断?

     用IDA看了一下win10 kernel32.dll的导出函数,没看到有这个函数,猜测应该是由头文件来实现的,于是找来一份VersionHelpers.h 

真相大白,其实就是调用ntdll里的RtlGetVersion函数来实现的。我们只需要拷贝一份这个头文件,直接调用相应的函数就可以了

贴一下这个头文件吧

/******************************************************************
*                                                                 *
*  VersionHelpers.h -- This module defines helper functions to    *
*                      promote version check with proper          *
*                      comparisons.                               *
*                                                                 *
*  Copyright (c) Microsoft Corp.  All rights reserved.            *
*                                                                 *
******************************************************************/
#ifndef _versionhelpers_H_INCLUDED_
#define _versionhelpers_H_INCLUDED_#ifndef ___XP_BUILD
#define WINAPI_PARTITION_DESKTOP   (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
#define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP
#define WINAPI_FAMILY_PARTITION(Partitions)     (Partitions)#define _WIN32_WINNT_NT4                    0x0400
#define _WIN32_WINNT_WIN2K                  0x0500
#define _WIN32_WINNT_WINXP                  0x0501
#define _WIN32_WINNT_WS03                   0x0502
#define _WIN32_WINNT_WIN6                   0x0600
#define _WIN32_WINNT_VISTA                  0x0600
#define _WIN32_WINNT_WS08                   0x0600
#define _WIN32_WINNT_LONGHORN               0x0600
#define _WIN32_WINNT_WIN7                   0x0601
#define _WIN32_WINNT_WIN8                   0x0602
#endif#ifdef _MSC_VER
#pragma once
#endif  // _MSC_VER#pragma region Application Family#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)#include <specstrings.h>    // for _In_, etc.#if !defined(__midl) && !defined(SORTPP_PASS)#if (NTDDI_VERSION >= NTDDI_WINXP)#ifdef __cplusplus#define VERSIONHELPERAPI inline bool#else  // __cplusplus#define VERSIONHELPERAPI FORCEINLINE BOOL#endif // __cplusplus#define _WIN32_WINNT_WINBLUE                0x0603
#define _WIN32_WINNT_WIN10                  0x0A00typedef NTSTATUS( NTAPI* fnRtlGetVersion )(PRTL_OSVERSIONINFOW lpVersionInformation);VERSIONHELPERAPI
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;*/RTL_OSVERSIONINFOEXW verInfo = { 0 };verInfo.dwOSVersionInfoSize = sizeof( verInfo );static auto RtlGetVersion = (fnRtlGetVersion)GetProcAddress( GetModuleHandleW( L"ntdll.dll" ), "RtlGetVersion" );if (RtlGetVersion != 0 && RtlGetVersion( (PRTL_OSVERSIONINFOW)&verInfo ) == 0){if (verInfo.dwMajorVersion > wMajorVersion)return true;else if (verInfo.dwMajorVersion < wMajorVersion)return false;if (verInfo.dwMinorVersion > wMinorVersion)return true;else if (verInfo.dwMinorVersion < wMinorVersion)return false;if (verInfo.wServicePackMajor >= wServicePackMajor)return true;}return false;
}VERSIONHELPERAPI
IsWindowsXPOrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 0 );
}VERSIONHELPERAPI
IsWindowsXPSP1OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 1 );
}VERSIONHELPERAPI
IsWindowsXPSP2OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 2 );
}VERSIONHELPERAPI
IsWindowsXPSP3OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 3 );
}VERSIONHELPERAPI
IsWindowsVistaOrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 0 );
}VERSIONHELPERAPI
IsWindowsVistaSP1OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 1 );
}VERSIONHELPERAPI
IsWindowsVistaSP2OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 2 );
}VERSIONHELPERAPI
IsWindows7OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 0 );
}VERSIONHELPERAPI
IsWindows7SP1OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 1 );
}VERSIONHELPERAPI
IsWindows8OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN8 ), LOBYTE( _WIN32_WINNT_WIN8 ), 0 );
}VERSIONHELPERAPI
IsWindows8Point1OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINBLUE ), LOBYTE( _WIN32_WINNT_WINBLUE ), 0 );
}VERSIONHELPERAPI
IsWindows10OrGreater()
{return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN10 ), LOBYTE( _WIN32_WINNT_WIN10 ), 0 );
}VERSIONHELPERAPI
IsWindowsServer()
{OSVERSIONINFOEXW osvi = { sizeof( osvi ), 0, 0, 0, 0, { 0 }, 0, 0, 0, VER_NT_WORKSTATION };DWORDLONG        const dwlConditionMask = VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL );return !VerifyVersionInfoW( &osvi, VER_PRODUCT_TYPE, dwlConditionMask );
}#endif // NTDDI_VERSION#endif // defined(__midl)#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */#pragma endregion#endif // _VERSIONHELPERS_H_INCLUDED_

win10 系统版本号获取的三种方法相关推荐

  1. 台式计算机颜色如何矫正,win10电脑显示器颜色不对如何调整|win10系统校正显示器色调的三种方法...

    正常情况下,电脑安装上win10安装版系统后,显示器颜色都是调好的,难免有些用户觉得显示图片颜色不太准确,看起来非常奇怪,对于制图人员来说,调整一个合适的显示器颜色是非常关键的,这会影响制图效果.大家 ...

  2. 服务器win10系统开机慢,win10专业版系统开机启动慢 三种方法帮你敲定

    win10专业版系统开机启动慢 三种方法帮你敲定对于很多游戏玩家来说,电脑运行速度快,使用不卡顿是非常重要的,有些使用win10系统的玩家会觉得win10的启动速度慢,为了让各位能够愉快的玩游戏,今天 ...

  3. win7 html 插件,win7系统清理插件的三种方法

    近期好多网友询问说win7系统怎么清理插件?我们在使用网络软件和插件时,可以带来很多便利.但是使用过程中会不可避免的安装一些不必要的电脑插件,甚至是恶评插件,这对电脑安全构成威胁.所以我们要清理一些无 ...

  4. matlab怎么恢复默认字体,windows10下恢复系统默认字体的三种方法

    一些朋友在更改win10系统界面默认字体后,会遇到设置界面显示不全的情况,此时我们只能将字体恢复成原来的样子.不过,由于大多用户不知道系统界面的默认字体是什么,导致无法恢复成正常状态.下面,系统城小编 ...

  5. Struts2获取request三种方法

    2019独角兽企业重金招聘Python工程师标准>>> Struts2获取request三种方法 Struts2获取request三种方法 struts2里面有三种方法可以获取req ...

  6. win10定时关机c语言,win10定时关机在哪?win10设置定时关机的三种方法

    win10定时关机在哪?很多win10用户可能还不会设置定时关机,下面脚本之家小编就给大家带来win10设置定时关机的三种方法,一起来看看吧! 方法一:Win10定时关机命令:shutdown –s ...

  7. win7 系统 内存测试软件,win7怎么检测内存 win7系统检测内存的三种方法

    win7系统检测内存的方法有很多种,我们都知道内存是电脑中十分重要的硬件,内存越大,电脑运行速度越快.当然内存也会发生错误,和磁盘坏道一样,内存有问题时容易导致系统崩溃,数据丢失,那么 Win7 64 ...

  8. win10系统ipv6服务器地址,教你Win10系统重新获取IPV6地址的方法

    Win10系统如何重新获取IPV6地址?随着IPV4地址的枯竭,IPV6地址是未来的方向.现在已经有很多网络环境中在使用IPV6地址.最近发现Win10有的时候能获得IPV6的地址,有的时候无法获得I ...

  9. 查找android studio版本号,Android studio版本号查看的三种方法

    Android studio版本号查看的三种方法 发布于 2016-04-10 22:50:17 | 688 次阅读 | 评论: 0 | 来源: 网友投递 Android Studio Android ...

最新文章

  1. 取出list中属性_你是否用过List<T>和List<?>?
  2. 英特尔更新人工智能产品线,新品性能达到竞品6倍
  3. NYOJ 79 拦截导弹
  4. netstat查看linux运行的端口,查看哪些端口被打开 netstat -anp
  5. Linux内核程序的编译:模块化编译
  6. (37)FPGA面试题实现约翰逊计数器
  7. 国内旅游业务全面复苏 携程后疫情时代如何深耕旅游市场?
  8. -seo要掌握的20条网站的准则
  9. android系统中使用ksoap2-android客户端库操作Asp.net WebService
  10. MyBatis逆向工程生成代码(附源码)
  11. 抖音直播带货流量池规则是什么?直播间没人怎么引流?
  12. element-ui 日期选择器DateTimePicker 的日期和后台不匹配,无法绑定(日期中含有T,Z)
  13. 自己的网站与UCenter整合(大致流程)
  14. 算法之美_源码公布(1)
  15. 两数互素有什么性质_两个数互素的性质
  16. Chapter Four : Python 序列之列表、元组操作详解合集
  17. ticker定时器用法
  18. java 布尔值变成字符串,Java将布尔值转换为字符串
  19. Vue—制作一个todoList
  20. 【手机LR预设】黑金风格RICH移动Lightroom预设

热门文章

  1. 昭和女神异闻录——中山美穗
  2. 语法糖 Syntactic sugar: 复杂代码的等价简洁替代
  3. [论文阅读] Facial Expression Recognition Using Residual Masking Network
  4. 如何在几百万qps的网关服务中实现灵活调度策略
  5. libreoffice7.0 离线安装
  6. html iframe自动高度,iframe高度自适应撑开
  7. DSP学习笔记之系统时钟、定时器、GPIO篇
  8. 初中三年级数学可以用计算机吗,不到3分钟,这份初中数学攻略被家长和学生疯狂转发!太实用了!...
  9. CSS实现文字凹凸效果
  10. cpu、内存、硬盘之间的关系