【问题标题】:Will Win32 GetVersionEx API with application manifest break in later version?带有应用程序清单的 Win32 GetVersionEx API 会在以后的版本中中断吗?
【发布时间】:2016-05-04 19:33:58
【问题描述】:

我有一个程序可以报告和/或检测 Windows 操作系统版本。它使用GetVersionEx,但在 Windows 8.1 及更高版本中,Microsoft intentionally broke this API 会返回错误的版本信息。 (显然,正确的版本检查对于大众来说太难了,但这是另一个话题的咆哮。)

我知道我可以添加一个清单来解决这个特定问题,但我的问题是关于“面向未来”的程序。

如果未来的用户在比 Windows 10 更新的操作系统上运行程序,GetVersionEx 是否会正常工作并报告“真实”操作系统版本,即使程序的清单不包含该版本的 GUID?

或者我注定要在每次发布新的操作系统版本时不断向清单中添加新的 GUID?

【问题讨论】:

  • 我相信查询操作系统版本最轻松/面向未来的方法是调用原生 API RtlGetVersion(如 how to detect windows 10 in c++ 中所述)。
  • @IInspectable: RtlGetVersion() 是获取 true 操作系统版本的几种可行方法之一。 WMI、NetServerGetInfo()NetWkstaGetInfo() 也可以使用。
  • 我在发布问题后看到了这些技巧。 RtlGetVersion 可能是做我需要的最简单的方法。谢谢!
  • Microsoft 认可的方法(仅用于记录/诊断目的!)是从系统 DLL(例如 kernel32.dll)中读取版本号。见stackoverflow.com/a/25986612/886887
  • 可能就像想向用户显示操作系统版本一样简单。

标签: winapi


【解决方案1】:

如果未来用户在比 Windows 10 更新的操作系统上运行程序,GetVersionEx 是否会正常工作并报告“真实”操作系统版本,即使程序的清单不包含该版本的 GUID?

,这是documented behavior

随着 Windows 8.1 的发布,GetVersionEx API 的行为在它为操作系统版本返回的值方面发生了变化。 GetVersionEx 函数返回的值现在取决于应用程序的显示方式。

未针对 Windows 8.1 或 Windows 10 显示的应用程序将返回 Windows 8 操作系统版本值 (6.2)。 一旦为给定的操作系统版本显示应用程序,GetVersionEx 将始终返回应用程序在未来版本中显示的版本。要为 Windows 8.1 或 Windows 10 显示应用程序,请参阅定位您的应用程序Windows 应用程序。

或者我注定要在每次发布新的操作系统版本时不断向清单中添加新的 GUID?

很遗憾,是的。版本表现的重点是明确报告您的应用程序已知兼容的操作系统版本。显然,您无法提前知道它是否与未来版本兼容。因此,每当发布新版本时,您都需要根据需要测试您的应用程序,验证它是否正常工作(并在需要时对其进行修复),然后相应地更新清单。在此之前,Windows 将自行降级,使其表现得像您在清单中报告的最高操作系统版本。

无论如何,您都不应该依赖GetVersionEx() 在运行时控制您的应用程序的功能。在日志等中报告操作系统版本是可以的(还有其他方法可以获取 true 操作系统版本,无论表现如何),但不要根据操作系统版本做出决定。例如,如果要使用仅在最近的操作系统版本中可用的给定功能,请不要检查操作系统版本,检查该功能本身是否存在,如果可用就使用它。

【讨论】:

  • 如前所述,我不使用GetVersionEx 在运行时控制应用程序功能。我用它来询问操作系统它是什么版本。但是感谢您的回答;我将不得不重新架构。
  • 不一定。例如,您可以简单地将GetVersionEx() 替换为RtlGetVersion()。它还没有(还没有?)表现出来。
  • 我的句子措辞相当笨拙。 “重新架构”是指“更新代码以使用不同的 API”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2021-10-16
  • 2012-09-03
  • 1970-01-01
  • 2014-11-16
  • 2023-03-12
相关资源
最近更新 更多