【问题标题】:Getting the Windows version?获取 Windows 版本?
【发布时间】:2011-12-29 23:37:43
【问题描述】:

谁能帮我检测一下用户可能使用的是哪个版本的 Windows?

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

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

提前致谢。

【问题讨论】:

标签: windows delphi winapi


【解决方案1】:

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

【讨论】:

  • Win32大版本还是一样,小版本升1。所以Vista+WSrv2003是“6.0”,Win7+WinServ2008是“6.1”。这非常简单。
【解决方案2】:

在 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 和更早版本中的实现是不正确的。

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

【讨论】:

    【解决方案3】:

    JEDI JCL 已经这样做了,即使在 XE2 之前的版本上也是如此。请参阅 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 GB 的可用空间。安装程序中的 32 位整数有符号值变为负数,从而破坏了安装程序。我必须将它安装到虚拟机中才能使其工作。添加“智能代码”通常会使您的应用程序“愚蠢”。小心点。

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

    【讨论】:

    • 过去 6-7 年我一直使用 JEDI 代码。最好不用自己写代码!
    • 此外,当新版本的 Windows Thingy 发布时,JCL 将由训练有素的猴子团队自动更新。只需进行 svn 更新,鲍勃就是你的叔叔。
    • David Heffernan 的 XE2 方法的优势在于它与 Firemonkey 兼容,因此不需要任何变通方法即可使其与 FMX 一起使用。不过,对于 VCL 或 pre-XE2,我也同意 JEDI。
    【解决方案4】:

    在 delphidabbler.com 上有一个 complete article 关于获取包括 64 位版本在内的操作系统版本。 这篇文章还没有更新到包括 Vista/7。但同样的功能可能仍然有效。

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2020-12-19
      • 2017-02-08
      • 2021-06-07
      • 2011-11-02
      • 2011-09-04
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多