转自http://www.07net01.com/2015/04/813058.html

微软在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 0x0A00 typedef 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 Is Windows7 OrGreater() { 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 Is Windows8 OrGreater() { 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 系统版本号获取的三种方法

    微软在windows 10的版本号获取上留下一个坑,如果用GetVersionEx获取版本号,则获取到的是6.2.9200 官方有如下说明 [GetVersionEx may be altered o ...

  2. 电脑联机获取更多主题服务器未响应,高手讲解win10系统联机获取更多主题的修复方法...

    最近小编发现win10系统用户比较关心win10系统联机获取更多主题的问题.虽然解决方法很简单,但是还有大部分用户不清楚win10系统联机获取更多主题到底要如何搞定.解决win10系统联机获取更多主题 ...

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

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

  4. 近期汇总:锁定任务栏 - 托盘图标重载 - 获取win10系统版本号

    //1. 锁定任务栏并置灰 BOOL LockTaskBar() {BOOL bSuc = FALSE;DWORD dwDisposition = REG_CREATED_NEW_KEY;HKEY h ...

  5. win10 系统怎么获取最高管理员权限删除文件

    http://www.xitongcity.com/jiaocheng/win8_content_3473.html 很多win8.1系统用户在对磁盘文件进行清理时,经常会遇到"文件夹访问被 ...

  6. C++通过系统版本号获取windows系统版本

    主要用到的windowsAPI为GetVersion()函数 代码 #define WIN10_VERSION 1 #define WIN7_VERSION 2//获取当前系统版本 DWORD get ...

  7. win10查看计算机管理员,win10系统下怎么获取administrator管理员权限

    在win10系统中,当我们要安装或运行一些软件的时候,经常会提示需要运行管理员权限,那么就需要获取administrator管理员权限才可以进行操作,但是很多用户并不知道要怎么获取,为此小编这就给大家 ...

  8. 获取进程全路径方法(支持xp、win7、win10系统)

    获取进程全路径方法(支持xp.win7.win10系统) 获取进程的全路径的函数包括GetModuleFileNameEx.GetProcessImageFileName.QueryFullProce ...

  9. win10系统如何查看系统版本号

    下面介绍三种超简单的查看win10系统版本号的方法 1.  win+R    输入winver 2. 新建txt文档,查看帮助/关于记事本 3. win+R  输入cmd

最新文章

  1. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示均值、中位数)实战
  2. nodejs与npm版本对应表
  3. SAP UI5 应用启动(bootstrap)过程单步调试
  4. 使用深度学习TensorFlow框架进行图片识别
  5. Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库
  6. 关于页面的多种自适应布局——两列布局
  7. 同包类 和 其他类 java_关于继承:为什么Java中的“protected”修饰符允许访问同一个包中的其他类?...
  8. jQuery学习之二---jq核心
  9. 七阶拉丁方阵_【C语言】输出N阶拉丁方阵并统计个数
  10. Google C++ 编程规范总结
  11. ROS 服务和参数:ROS Services and Parameters
  12. swagger访问开关配置
  13. Angular 8 发布
  14. ECshop二次开发从开始
  15. Java 运算符 输入 分支语句
  16. docker最全笔记速查,逻辑清晰
  17. TO_DATE()函数?
  18. gdpr隐私保护_微信公众平台已发布GDPR隐私保护条例的新措施
  19. 使用Layui制作界面及功能
  20. 可用计算机玩游戏,MONI玩 全球唯一可用电脑玩手游的平台

热门文章

  1. 灯光渡桥舞台灯光舞台机械舞台音响项目提供商-腾享
  2. XMind 2020 for mac (XMind思维导图)
  3. 20考研中山大学计算机专硕初试392分经验贴
  4. 计算机房防凝露保温材料,机房墙面为什么要做保温?该怎么做?
  5. 【TRIO-Basic从入门到精通教程六】3D仿真、同步控制的使用1
  6. 公司注销时一定查三年账吗?公司注销有哪些税务问题要注意?
  7. php DHT22,【CH579M-R1】+DHT22温湿度检测
  8. 谁能提供一个带条码生成器的CorelDRAW 9 ?
  9. 把PE写进U盘的一个分区
  10. 模式识别学习笔记(11)——线性判别函数