在Windows 10上,“IsWindows10OrGreater()”出现故障

6
我写了一段代码,使用GetVersionEx函数获取Windows的主版本号和次版本号,但是这个函数总是返回6作为主版本号,2作为次版本号。
MSDN建议我们使用Version Helper APIs来查找当前的操作系统。我在Windows 8.1上构建了项目,并引用了Windows 8.1 kits路径来包含VersionHelpers头文件。但是,在VersionHelpers头文件中没有可用的IsWindows10OrGreater()函数。
因此,我从GitHub下载了VersionHelper头文件,并将其添加到我的项目中。编译错误消失了,但是IsWindows10OrGreater函数执行失败。
我做错了什么吗?

1
你从哪里下载的VersionHelper.h?GitHub上不仅托管一个项目... - Simon Kraemer
5
如果您希望GetVersionEx返回正确的版本信息,您应该在清单文件中指定Windows 8.1/10的支持。https://msdn.microsoft.com/en-us/library/windows/desktop/dn481241%28v=vs.85%29.aspx - zenden2k
1
微软已经承诺很长时间,他们将打败版本检查。这在Win10中得到了充分的执行。要想重新获得版本10,唯一的方法是构建您的程序以针对Win10。项目>属性>链接器>系统>最低所需版本必须设置为“10.0”。这完全没有意义并不是偶然的 :)另一种方法是从DLL(如kernel32.dll)获取版本资源。 - Hans Passant
为了跟进@Hans Passant的评论,Raymond Chen的文章(http://blogs.msdn.com/b/oldnewthing/archive/2004/02/13/72476.aspx)解释了为什么Windows 95称自己为版本3.95而不是4.0,其中提到了Windows中版本号报告的奇怪之处。简而言之-人们编写版本检查时会出错,因此API会报告一个“错误”的版本号,以便新操作系统可以运行旧软件。 - theB
1
清单文件没有声明子系统版本。它可以有<supportedOS>元素,但这仅适用于Win10的预览版,它在RTM中被删除了。 - Hans Passant
显示剩余3条评论
1个回答

15

VersionHelper函数只是VerifyVersionInfo()的包装器。从Windows 10开始,VerifyVersionInfo()现在也受到与GetVersionEx()相同的版本表现规则的约束。要获取真正的OS版本而不受表现的影响,您可以使用RtlGetVersion()NetServerGetInfo()NetWkstaGetInfo()


1
如何使用 RtlGetVersion() 获取操作系统版本? - Stevoisiak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接