获得Windows版本?

时间:2011-11-15 23:25:22

标签: windows delphi winapi

任何人都可以帮我检测用户可能使用的Windows版本吗?

我已经看到了一些示例,但它们未针对Vista / 7操作系统进行更新。

此外,检测操作系统是否在x32或x64架构上运行会很有用。

提前致谢。

4 个答案:

答案 0 :(得分:36)

在XE2上引入了一个新类来处理这个问题:TOSVersion

  • 读取TOSVersion.Architecture以检查32位或64位操作系统。
  • 阅读TOSVersion.Platform以检查Windows或Mac。
  • 阅读TOSVersion.MajorTOSVersion.Minor了解版本号。
  • 阅读TOSVersion.Name以获取基本产品名称,例如Windows 7。
  • 阅读TOSVersion.ToString以获取包含版本的完整产品名称,例如Windows 7 Service Pack 1(版本6.1,Build 7601,64位版本)。

对于旧版本的Delphi,我建议如下:

为了检查2000,XP,Vista,7我建议你阅读Win32MajorVersionWin32MinorVersion

  • major.minor = 5.0 => Windows 2000
  • major.minor = 5.1 => Windows XP
  • major.minor = 5.2 => Windows 2003服务器或XP64
  • major.minor = 6.0 => Windows Vista / 2008服务器
  • major.minor = 6.1 => Windows 7/2008服务器R2

同样的信息可以在MSDN上获得,但上面的内容来自我的头脑!

如果您想要非常详细的产品信息,那么需要更多的工作。沃伦的回答为获得这些信息提供了一条很好的途径。如果您想测试功能,那么版本号就可以了。

使用CheckWin32Version检查主要操作系统是否超过某个版本级别。虽然您应该在Delphi中检查该函数是否正常工作,因为在Delphi 6及更早版本中该函数的实现是不正确的。

要了解本机OS体系结构(32位或64位),请使用GetNativeSystemInfo功能。此功能在较旧的操作系统上不可用,因此您应使用GetProcAddress显式加载它。测试wProcessorArchitecture=PROCESSOR_ARCHITECTURE_AMD64以检查64位操作系统。

答案 1 :(得分:9)

即使在早于XE2的版本上,JEDI JCL也已经这样做了。请参阅David对XE2及更高版本中内置解决方案的回答。

使用Jedi JCL,您可以添加单元JclSysInfo,并调用函数GetWindowsVersion。它返回枚举类型TWindowsVersion。

目前JCL包含所有已发布的Windows版本,并且每次Microsoft在一个盒子中发布新版本的Windows时都会更改:

  TWindowsVersion =
   (wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME,
    wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,
    wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008,
    wvWin7, wvWinServer2008R2);

如果您想知道您是在运行64位Windows 7而不是32位,请致电JclSysInfo.IsWindows64

请注意,JCL还可以处理版本,如Pro,Ultimate等。对于调用GetWindowsEdition,它会返回其中一个:

TWindowsEdition =
   (weUnknown, weWinXPHome, weWinXPPro, weWinXPHomeN, weWinXPProN, weWinXPHomeK,
    weWinXPProK, weWinXPHomeKN, weWinXPProKN, weWinXPStarter, weWinXPMediaCenter,
    weWinXPTablet, weWinVistaStarter, weWinVistaHomeBasic, weWinVistaHomeBasicN,
    weWinVistaHomePremium, weWinVistaBusiness, weWinVistaBusinessN,
    weWinVistaEnterprise, weWinVistaUltimate, weWin7Starter, weWin7HomeBasic,
    weWin7HomePremium, weWin7Professional, weWin7Enterprise, weWin7Ultimate);

对于历史兴趣,您也可以使用NtProductType函数检查NT级版本,它返回:

 TNtProductType =       (ptUnknown, ptWorkStation, ptServer, ptAdvancedServer,        
        ptPersonal, ptProfessional, ptDatacenterServer, 
        ptEnterprise, ptWebEdition);

请注意,上面检测到“N个版本”。这是由欧盟反垄断法规创建的欧盟(欧洲)版Windows。这是JCL内部非常精细的检测级别。

这是一个示例函数,可帮助您检测Vista,并在Vista上执行一些特殊操作。

function IsSupported:Boolean;
begin
  case GetWindowsVersion of
     wvVista:  result := false; 
    else
      result := true;
  end;
end;

请注意,如果您想要“大于”检查,那么您应该使用其他技术。另请注意,版本检查通常可能是未来破损的来源。我通常选择警告用户并继续,以便我的二进制代码在将来不会成为破坏的实际来源。

最近我试图安装一个应用程序,安装程序检查了我的驱动器可用空间,并且无法安装,因为我有超过2千兆字节的可用空间。安装程序中的32位整数签名值变为负数,从而破坏了安装程序。我不得不将它安装到VM中以使其工作。添加“智能代码”通常会使您的应用程序“愚蠢”。要小心。

顺便说一句,我发现从命令行可以运行WMIC.exe,并输入path Win32_OperatingSystem(“Select * from Win32_OperatingSystem”对我来说不起作用)。将来也许可以将JCL扩展为使用WMI信息。

答案 2 :(得分:2)

显示here的单元(GetWinVersionInfo)可以检测到Vista。我无法想象为Windows 7更新它会是那么困难。我认为它不会告诉你x86.x64。

答案 3 :(得分:1)

在delphidabbler.com上,有一个complete article关于获取包含64位版本的操作系统版本。 该文章尚未更新,包括Vista / 7。但是相同的功能可能仍然有效。