根据此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后,我使用Win32MajorVersion
和Win32MinorVersion
尝试了这个稍微修改过的版本,但得到了相同的结果。
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;
答案 0 :(得分:2)
如您所知,GetVersionEx
在没有清单的情况下不会返回6.2以上的任何内容。据我所知,只有两种方法可以在Windows 8上返回较低的值:
已打开兼容性填充程序。检查.exe和/或.lnk的文件属性中的兼容性选项卡。您还应该在注册表中搜索可执行文件名称,并查看它是否应用了任何自动填充程序。
PE headers中有一个字段可以覆盖返回的版本,但这不太可能是您的问题。
在NTDLL中调用RtlVerifyVersionInfo
(未记录用户模式用法)应该允许您绕过Windows 8.1上的兼容性填充程序。