win10 系统版本号获取的三种方法
微软在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 |
|
Library |
|
DLL |
|
需要windows 10以后才可用,老版本的系统怎么用呢
是不是只有win10下的kernel32.dll才导出了这个函数呢,是不是需要动态获取这个函数来判断?
真相大白,其实就是调用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 系统版本号获取的三种方法相关推荐
- 台式计算机颜色如何矫正,win10电脑显示器颜色不对如何调整|win10系统校正显示器色调的三种方法...
正常情况下,电脑安装上win10安装版系统后,显示器颜色都是调好的,难免有些用户觉得显示图片颜色不太准确,看起来非常奇怪,对于制图人员来说,调整一个合适的显示器颜色是非常关键的,这会影响制图效果.大家 ...
- 服务器win10系统开机慢,win10专业版系统开机启动慢 三种方法帮你敲定
win10专业版系统开机启动慢 三种方法帮你敲定对于很多游戏玩家来说,电脑运行速度快,使用不卡顿是非常重要的,有些使用win10系统的玩家会觉得win10的启动速度慢,为了让各位能够愉快的玩游戏,今天 ...
- win7 html 插件,win7系统清理插件的三种方法
近期好多网友询问说win7系统怎么清理插件?我们在使用网络软件和插件时,可以带来很多便利.但是使用过程中会不可避免的安装一些不必要的电脑插件,甚至是恶评插件,这对电脑安全构成威胁.所以我们要清理一些无 ...
- matlab怎么恢复默认字体,windows10下恢复系统默认字体的三种方法
一些朋友在更改win10系统界面默认字体后,会遇到设置界面显示不全的情况,此时我们只能将字体恢复成原来的样子.不过,由于大多用户不知道系统界面的默认字体是什么,导致无法恢复成正常状态.下面,系统城小编 ...
- Struts2获取request三种方法
2019独角兽企业重金招聘Python工程师标准>>> Struts2获取request三种方法 Struts2获取request三种方法 struts2里面有三种方法可以获取req ...
- win10定时关机c语言,win10定时关机在哪?win10设置定时关机的三种方法
win10定时关机在哪?很多win10用户可能还不会设置定时关机,下面脚本之家小编就给大家带来win10设置定时关机的三种方法,一起来看看吧! 方法一:Win10定时关机命令:shutdown –s ...
- win7 系统 内存测试软件,win7怎么检测内存 win7系统检测内存的三种方法
win7系统检测内存的方法有很多种,我们都知道内存是电脑中十分重要的硬件,内存越大,电脑运行速度越快.当然内存也会发生错误,和磁盘坏道一样,内存有问题时容易导致系统崩溃,数据丢失,那么 Win7 64 ...
- win10系统ipv6服务器地址,教你Win10系统重新获取IPV6地址的方法
Win10系统如何重新获取IPV6地址?随着IPV4地址的枯竭,IPV6地址是未来的方向.现在已经有很多网络环境中在使用IPV6地址.最近发现Win10有的时候能获得IPV6的地址,有的时候无法获得I ...
- 查找android studio版本号,Android studio版本号查看的三种方法
Android studio版本号查看的三种方法 发布于 2016-04-10 22:50:17 | 688 次阅读 | 评论: 0 | 来源: 网友投递 Android Studio Android ...
最新文章
- 取出list中属性_你是否用过List<T>和List<?>?
- 英特尔更新人工智能产品线,新品性能达到竞品6倍
- NYOJ 79 拦截导弹
- netstat查看linux运行的端口,查看哪些端口被打开 netstat -anp
- Linux内核程序的编译:模块化编译
- (37)FPGA面试题实现约翰逊计数器
- 国内旅游业务全面复苏 携程后疫情时代如何深耕旅游市场?
- -seo要掌握的20条网站的准则
- android系统中使用ksoap2-android客户端库操作Asp.net WebService
- MyBatis逆向工程生成代码(附源码)
- 抖音直播带货流量池规则是什么?直播间没人怎么引流?
- element-ui 日期选择器DateTimePicker 的日期和后台不匹配,无法绑定(日期中含有T,Z)
- 自己的网站与UCenter整合(大致流程)
- 算法之美_源码公布(1)
- 两数互素有什么性质_两个数互素的性质
- Chapter Four : Python 序列之列表、元组操作详解合集
- ticker定时器用法
- java 布尔值变成字符串,Java将布尔值转换为字符串
- Vue—制作一个todoList
- 【手机LR预设】黑金风格RICH移动Lightroom预设
热门文章
- 昭和女神异闻录——中山美穗
- 语法糖 Syntactic sugar: 复杂代码的等价简洁替代
- [论文阅读] Facial Expression Recognition Using Residual Masking Network
- 如何在几百万qps的网关服务中实现灵活调度策略
- libreoffice7.0 离线安装
- html iframe自动高度,iframe高度自适应撑开
- DSP学习笔记之系统时钟、定时器、GPIO篇
- 初中三年级数学可以用计算机吗,不到3分钟,这份初中数学攻略被家长和学生疯狂转发!太实用了!...
- CSS实现文字凹凸效果
- cpu、内存、硬盘之间的关系