Windows 8.1 GetVersionEx返回6.2.9200 的问题!
2013-11-18 12:02
351 查看
http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx
http://tunps.com/getversionex-on-windows-8-1-return-6-2-9200
某程序需要判断当前Windows系统的版本号。Windows系统的版本号格式为:majorVersion.minorVersion.BuildNumber.
Windows 8 RTM的版本号的6.2.9200 Windows 8.1 Preview的版本好是6.3.9431
使用以下代码在Win8下面运行正常的显示为6.2.9200 , 但是接下来在Win8.1下面测试尽然还是6.2.9200。
而通过Win8.1自带的命令行systeminfo(采用WMI方式)返回的是正确的版本号
google了一下,MSDN论坛上有个帖子遇到同样的问题。实际上这个问题并非bug,而是微软有意为之。
如果程序的目标运行平台不需要支持Win8.1,那么GetVersion(Ex)就给你返回6.2,
除非通过App manifests方式指定程序支持Win8.1系统:
<exe>.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity
type="win32"
name=SXS_ASSEMBLY_NAME
version=SXS_ASSEMBLY_VERSION
processorArchitecture=SXS_PROCESSOR_ARCHITECTURE
/>
<description> my app exe </description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
* <!-- 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>
</assembly>
在Win8.1系统以后GetVersion(Ex)被放到兼容层(shim)里面,这样GetVersion(Ex)并不一定会返回系统真实的版本号。
取而代之可以采用VersionHelpers方式获取真实的系统版本号。
C++
#include <VersionHelpers.h>
…
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
http://tunps.com/getversionex-on-windows-8-1-return-6-2-9200
某程序需要判断当前Windows系统的版本号。Windows系统的版本号格式为:majorVersion.minorVersion.BuildNumber.
Windows 8 RTM的版本号的6.2.9200 Windows 8.1 Preview的版本好是6.3.9431
使用以下代码在Win8下面运行正常的显示为6.2.9200 , 但是接下来在Win8.1下面测试尽然还是6.2.9200。
而通过Win8.1自带的命令行systeminfo(采用WMI方式)返回的是正确的版本号
google了一下,MSDN论坛上有个帖子遇到同样的问题。实际上这个问题并非bug,而是微软有意为之。
如果程序的目标运行平台不需要支持Win8.1,那么GetVersion(Ex)就给你返回6.2,
除非通过App manifests方式指定程序支持Win8.1系统:
<exe>.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity
type="win32"
name=SXS_ASSEMBLY_NAME
version=SXS_ASSEMBLY_VERSION
processorArchitecture=SXS_PROCESSOR_ARCHITECTURE
/>
<description> my app exe </description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
* <!-- 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>
</assembly>
在Win8.1系统以后GetVersion(Ex)被放到兼容层(shim)里面,这样GetVersion(Ex)并不一定会返回系统真实的版本号。
取而代之可以采用VersionHelpers方式获取真实的系统版本号。
C++
#include <VersionHelpers.h>
…
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
相关文章推荐
- Windows 8.1 GetVersionEx返回6.2.9200 的问题
- GetVersionEx的降级问题
- windows socket编程中调用recvfrom返回-1(windows error 10014)错误的问题
- XUtils骨架HttpUtils采用Get总是返回请求解决问题的相同信息
- Spring MVC 返回NULL时客户端用$.getJSON的问题
- js中this指向问题: (object.getName = object.getName)()为何返回“window”
- $.getJSON()处理数据及IE返回错误的问题
- Android:解决view.getDrawingCache()返回null的问题
- Windows 8.1激活问题
- Dialog 调用getWindows()函数进行系统设置 背光问题
- GetVersion与GetVersionExW/A
- getActionBar() 返回空指针问题
- 执行、获取远程代码返回:file_get_contents 超时处理的问题详解
- Spring学习笔记(三十四):关于http的get请求返回的数据过长问题
- AS3 textfield.getCharBoundaries(index) 有时会返回NULL的问题解决方案
- Windows.Web.Http.HttpClient.GetStringAsync 总是返回相同的结果
- Xutils的get请求后,总是返回同样数据的问题解决方式
- 关于GetConstantByName始终返回0的问题
- Windows 8.1 & Windows Phone 开发环境安装遇到的问题