在Windows 7上GetVersionEx无法工作?

6
在我的Windows 7系统上,GetVersionEx Windows API函数返回"6.0",表示Windows Vista,而不是应该返回"6.1"。
如果有关系的话,我使用了以下Delphi代码:
function winver: string;
var
  ver: TOSVersionInfo;
begin
  ver.dwOSVersionInfoSize := SizeOf(ver);
  if GetVersionEx(ver) then
    with ver do
      result := IntToStr(dwMajorVersion) + '.' + IntToStr(dwMinorVersion) + '.' + IntToStr(dwBuildNumber) + ' (' + szCSDVersion + ')';
end;

并返回了字符串“6.0.6002(服务包2)”。

这不是非常奇怪吗?

3个回答

9

我现在发现当我的应用程序通过Delphi 2009调试器运行时,GetVersionEx返回Vista,但是当应用程序单独执行时返回Windows 7。我还发现RAD Studio(Delphi IDE)实际上在兼容模式下运行Windows Vista SP2。因此,正如kibab所指出的,子进程将“继承”其父进程的兼容性设置,一切都说得通。


8
你的可执行文件是否使用了任何兼容性设置(我假设这可能是传统Delphi应用程序的情况)?GetVersionEx 的文档说明如下:

如果启用了兼容性模式,则 GetVersionEx 函数报告操作系统标识自身的操作系统,该操作系统可能不是已安装的操作系统。例如,如果启用了兼容性模式,则 GetVersionEx 报告为应用程序兼容性所选的操作系统。

也许GetProductInfo可以满足你的需求?

另外,您需要记住,如果您正在创建与 Vista SP2 兼容的子进程,则该子进程也将继承该行为。例如:您正在使用具有 VistaSP2 兼容性的 TotalCommander,则 TC 启动的每个进程也将使用 VistaSP2 兼容性。 - Krystian Bigaj
4
我现在发现当我的应用程序通过Delphi 2009调试器运行时,GetVersionEx返回Vista,但是当应用程序单独执行时,返回Windows 7。 - Andreas Rejbrand
2
@Andreas,我认为这应该作为答案而不是评论。也就是说,你找到了真正的答案,所以你应该将其发布为答案。0xA3给出了一个很好的答案,但我认为你的才是最佳答案。 - Chris Thornton
@Chris Thornton:你可能是对的,我会这样做(但我不能在两天内接受自己的答案)。 - Andreas Rejbrand

1

我认为可能只是你的问题。也就是说,你的D2009可能已被Windows标记为需要在兼容模式下运行。

我使用了你的函数制作了一个测试应用程序,并在调试器内部和外部(在Windows资源管理器中单击exe文件)编译和运行了D2009和D2010版本。对于这4种情况,它都返回了:6.1.7600 ()

在32位的Windows7上运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接