操作系统版本返回Windows XP,但预期Windows 8.1

时间:2017-02-24 23:30:21

标签: delphi winapi delphi-7

根据此MSDN article,Windows 8.1的Operating System Version应为6.3(如果应用程序清单未专门针对Windows 8.1,则为6.2)。但是下面的代码返回“Windows XP Service Pack 3”。请注意,这是一个用Delphi 7编写的旧应用程序。

procedure GetWindowsOS();
var
    osVer: TOSVERSIONINFO;
begin
    // Get the Windows OS version
    osVer.dwOSVersionInfoSize := SizeOf(osVer);
    GetVersionEx(osVer);
    if (osVer.dwMajorVersion = 6) and (osVer.dwMinorVersion = 3) then
        Windows81()     // Not getting here...
    else if (osVer.dwMajorVersion = 5) and (osVer.dwMinorVersion = 1) then
        WindowsXP();    // ...getting here instead
end;

知道为什么吗? Windows 8.1系统是64位的,如果这有所不同。

*更新*

搜索Embarcadero documentation后,我使用Win32MajorVersionWin32MinorVersion尝试了这个稍微修改过的版本,但得到了相同的结果。

procedure GetWindowsOS();
begin
    // Get the Windows OS version
    if (Win32MajorVersion = 6) and (Win32MinorVersion = 3) then
        Windows81()     // Not getting here...
    else if (Win32MajorVersion = 5) and (Win32MinorVersion = 1) then
        WindowsXP();    // ...getting here instead
end;

1 个答案:

答案 0 :(得分:2)

如您所知,GetVersionEx在没有清单的情况下不会返回6.2以上的任何内容。据我所知,只有两种方法可以在Windows 8上返回较低的值:

  • 已打开兼容性填充程序。检查.exe和/或.lnk的文件属性中的兼容性选项卡。您还应该在注册表中搜索可执行文件名称,并查看它是否应用了任何自动填充程序。

  • PE headers中有一个字段可以覆盖返回的版本,但这不太可能是您的问题。

在NTDLL中调用RtlVerifyVersionInfo(未记录用户模式用法)应该允许您绕过Windows 8.1上的兼容性填充程序。