带有应用程序清单的Win32 GetVersionEx API会在更高版本中中断吗?

时间:2016-05-04 19:33:58

标签: winapi

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

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

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

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

1 个答案:

答案 0 :(得分: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()来控制应用程序在运行时的功能。可以在日志等中报告操作系统版本(并且还有其他方法可以获得真正的操作系统版本,无论其表现形式如何),但不能根据操作系统版本做出决策。例如,如果要使用仅在最近的操作系统版本中可用的给定功能,请不要检查操作系统版本,检查功能本身是否存在,并在可用时使用它。

相关问题