从Windows 8.1开始,GetVersion和GetVersionEx已被弃用,声明如下:
[GetVersion/GetVersionEx 可能在Windows 8.1之后的版本中被更改或不可用。请使用Version Helper函数]
没有任何version helper APIs可以帮助我获取操作系统版本号,而只能帮助我验证或了解我的版本是否与某个特定版本相同或以上。有什么办法吗?
随着 Windows 8.1 的发布,GetVersionEx API的行为在其返回的操作系统版本值方面发生了更改。GetVersionEx函数返回的值现在取决于应用程序是否已启动。
未针对Windows 8.1创建清单的应用程序将返回Windows 8操作系统版本值(6.2)。一旦将应用程序针对特定操作系统版本进行了清单处理,GetVersionEx在未来发布中始终会返回该应用程序所针对的版本。请参考针对Windows 8.1定位您的应用程序,以便为Windows 8.1创建清单。
您需要做的是向应用程序(.exe/.dll)二进制文件添加正确的GUID(通过清单XML信息)。换句话说,如果明确声明您的应用程序支持8.1,则在Windows 8.1上运行时,GetVersionEx()将返回正确的信息;否则,它将欺骗您。
请参阅面向Windows 8.1定位您的应用程序,了解GUID列表。此外,在这里和这里也有相关信息。
懒人专属GUID列表
{e2011457-1546-43c5-a5fe-008deee3d3f0}
{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
{1f676c76-80e1-4239-95bb-83d0f6d0da78}
{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
关于Windows Server 2019,我不确定是否已发布新的GUID。如果您了解更多信息,请评论!
有一个名为GetProductInfo的新函数,返回版本信息。
如果您想测试特定版本,应使用VerifyVersionInfo
很容易创建一个结构来检查特定操作系统版本是否正在运行。 VerifyVersionInfo需要两个版本结构,您可以轻松检查VER_GREATER_EQUAL和VER_LESS_EQUAL
还要注意,如果在兼容性部分为您的清单定义了正确的支持的操作系统条目,则GetVersionEx不会在Windows 8.1系统上说谎。但它可能会在将来的操作系统版本中说谎!
请参见针对Windows 8.1定位您的应用程序以获取GUID列表。 还在此处中介绍。
应用程序清单的GUID列表
{e2011457-1546-43c5-a5fe-008deee3d3f0}
{35138b9a-5d96-4fbd-8e2d-a2440225f93a}
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
{1f676c76-80e1-4239-95bb-83d0f6d0da78}
{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
GetProductInfo()
函数不返回操作系统版本信息。你需要传入所需的操作系统版本,它会返回操作系统的产品类型(如商业、企业、数据中心等)。这在文档中已经明确说明:"检索本地计算机上操作系统的产品类型,并将该类型映射到指定操作系统支持的产品类型。" - Remy Lebeau请查看codeproject.com上的这篇文章,它在Windows 8上运行得非常完美:
1)下载.DLL并将其添加到您的项目中。
2)使用此代码获取操作系统信息:
StringBuilder sb = new StringBuilder(String.Empty);
sb.AppendLine("Operation System Information");
sb.AppendLine("----------------------------");
sb.AppendLine(String.Format("Name = {0}", OSVersionInfo.Name));
sb.AppendLine(String.Format("Edition = {0}", OSVersionInfo.Edition));
if (OSVersionInfo.ServicePack!=string.Empty)
sb.AppendLine(String.Format("Service Pack = {0}", OSVersionInfo.ServicePack));
else
sb.AppendLine("Service Pack = None");
sb.AppendLine(String.Format("Version = {0}", OSVersionInfo.VersionString));
sb.AppendLine(String.Format("ProcessorBits = {0}", OSVersionInfo.ProcessorBits));
sb.AppendLine(String.Format("OSBits = {0}", OSVersionInfo.OSBits));
sb.AppendLine(String.Format("ProgramBits = {0}", OSVersionInfo.ProgramBits));
textBox1.Text = sb.ToString();