Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 当GetVersion/GetVersionEx被弃用时,如何在Win8.1中获取操作系统版本?_Windows_Winapi_Visual Studio 2013_Windows 8.1_Minimumosversion - Fatal编程技术网

Windows 当GetVersion/GetVersionEx被弃用时,如何在Win8.1中获取操作系统版本?

Windows 当GetVersion/GetVersionEx被弃用时,如何在Win8.1中获取操作系统版本?,windows,winapi,visual-studio-2013,windows-8.1,minimumosversion,Windows,Winapi,Visual Studio 2013,Windows 8.1,Minimumosversion,我有一些场景,我想特别了解操作系统的主要/次要版本和内部版本号等 从windows 8.1开始,已弃用GetVersion和GetVersionEx,声明: [/在Windows 8.1之后的版本中可能会被更改或不可用。请改用版本帮助功能] 这些都不能帮助我获得操作系统的版本号,而只能帮助我验证或了解我的版本是否与上面提到的某个版本相同或更高。可以做什么?有一个名为的新函数,用于返回版本信息 如果你想测试一个特定的版本,你应该使用 很容易创建一个结构来检查特定的OS版本是否正在运行。Verify

我有一些场景,我想特别了解操作系统的主要/次要版本和内部版本号等

从windows 8.1开始,已弃用
GetVersion
GetVersionEx
,声明:

[/在Windows 8.1之后的版本中可能会被更改或不可用。请改用版本帮助功能]


这些都不能帮助我获得操作系统的版本号,而只能帮助我验证或了解我的版本是否与上面提到的某个版本相同或更高。可以做什么?

有一个名为的新函数,用于返回版本信息

如果你想测试一个特定的版本,你应该使用

很容易创建一个结构来检查特定的OS版本是否正在运行。VerifyVersionInfo采用版本结构,您可以轻松检查VER_GREATER_EQUAL和VER_LESS_EQUAL

另外请注意,如果在清单的兼容性部分中定义了正确的受支持操作系统条目,则GetVersionEx不在Windows 8.1系统上。但它可能存在于未来的操作系统版本中

有关GUID的列表,请参见。也包括

应用程序清单的GUID列表

  • Vista:
    {e2011457-1546-43c5-a5fe-008deee3d3f0}
  • Windows 7:
    {35138b9a-5d96-4fbd-8e2d-a2440225f93a}
  • Windows 8:
    {4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
  • Windows 8.1:
    {1f676c76-80e1-4239-95bb-83d0f6d0da78}
  • Windows 10:
    {8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}
检查,它在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();
该API继续在Windows 8.1+中工作,但Microsoft已更改了其功能。来自MSDN(重点矿山):

随着Windows 8.1的发布,GetVersionEx API的行为 已更改它将为操作系统返回的值 版本GetVersionEx函数返回的值现在取决于 关于应用程序的表现方式

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

您需要做的是向应用程序(.exe/.dll)二进制文件添加正确的GUID(通过清单XML信息)。换句话说,如果您特别声明应用程序支持8.1,则在Windows 8.1上运行时,GetVersionEx()将返回正确的信息。如果不这样做,GetVersionEx()将欺骗您

有关GUID的列表,请参见。 还有

懒惰者的GUID列表

  • Vista/Server 2008:
    {e2011457-1546-43c5-a5fe-008deee3d3f0}
  • Windows 7/Server 2008 R2:
    {35138b9a-5d96-4fbd-8e2d-a2440225f93a}
  • Windows 8/Server 2012:
    {4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
  • Windows 8.1/Server 2012 R2:
    {1f676c76-80e1-4239-95bb-83d0f6d0da78}
  • Windows 10/Server 2016:
    {8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}

至于WindowsServer2019,我不确定是否发布了新的GUID。请评论,如果你知道更多

我还不知道微软会删除一个API函数,即使它不推荐使用,所以我想说,如果你想继续使用它。请注意,在更高版本的Windows中,它与版本号有关,除非您的清单指定与当前版本的兼容性。有WMI的Win32_OperatingSystem类@Alex说这很好。您始终可以从内核32读取版本资源。您在这里的具体场景是什么?另外,请参阅堆栈溢出线程。@AlexK。我想你应该把它作为这个问题的答案,因为没有一个答案是关于WMI查询的。我想得到我正在运行的程序的操作系统的主要、次要和内部版本号吗?如何使用GetProductInfo和VerifyVersionInfo获得此信息?您可以使用VerifyVersionInfo获得service pack主要编号。我不知道SP中的操作系统内部版本号是否不同…
GetProductInfo()
不会返回操作系统版本。您将其传递到所需的操作系统版本中,它将返回操作系统的产品类型(业务、企业、数据中心等)。“检索本地计算机上操作系统的产品类型,并将该类型映射到指定操作系统支持的产品类型。”中明确说明了这一点。如果我的应用程序没有mainfest怎么办?您只需在项目设置中添加一个mainfest即可。请参阅此处的示例:请记住,除非您不断更新应用程序,否则最终您的清单将不包括“最新”版本的Windows,并且您将得到一个版本谎言。同时请记住,除非您在最新版本上更新和测试应用程序,否则它很可能会崩溃。例如:GetVersionEx()按预期停止运行。这是WAD。要以Windows 8.1为目标,您需要在源文件中包含应用程序清单或包含_NT_target_VERSION=$(_NT_target_VERSION_LATEST)。问题是把include\NT\u TARGET\u版本放在哪里?哪个源文件?