获取Windows版本?

获取Windows版本?,windows,delphi,winapi,Windows,Delphi,Winapi,有人能帮我检测用户可能使用的Windows版本吗 我已经看到了一些这样做的例子,但是它们没有针对Vista/7操作系统进行更新 此外,检测操作系统是否在x32或x64体系结构上运行也很有用 提前感谢。显示的装置(GetWinVersionInfo)最多可检测到Vista。我无法想象为Windows7更新它会有那么困难。但是我不认为它告诉您x86.x64。在XE2上引入了一个新类来处理这个问题: 阅读TOSVersion.Architecture检查32位或64位操作系统 阅读TOSVersio

有人能帮我检测用户可能使用的Windows版本吗

我已经看到了一些这样做的例子,但是它们没有针对Vista/7操作系统进行更新

此外,检测操作系统是否在x32或x64体系结构上运行也很有用


提前感谢。

显示的装置(GetWinVersionInfo)最多可检测到Vista。我无法想象为Windows7更新它会有那么困难。但是我不认为它告诉您x86.x64。

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

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

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

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

  • major.minor=5.0=>Windows 2000
  • major.minor=5.1=>Windows XP
  • major.minor=5.2=>Windows2003Server或XP64
  • major.minor=6.0=>WindowsVista/2008服务器
  • major.minor=6.1=>Windows7/2008服务器R2
同样的信息也可以在上找到,但是上面的信息来自我的脑袋

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

用于检查当前操作系统是否超过某个版本级别。尽管您应该检查该函数在Delphi中是否正常工作,因为Delphi 6和更早版本中该函数的实现是不正确的


要了解本机OS体系结构是什么(32或64位),请使用函数。此函数在较旧的操作系统上不可用,因此应使用
GetProcAddress
显式加载它。测试
wProcessorArchitecture=PROCESSOR\u ARCHITECTURE\u AMD64以检查64位操作系统。

即使在XE2之前的版本上,绝地JCL也已经这样做了。有关XE2和更高版本中的内置解决方案,请参见David的答案

使用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 allso为该调用GetWindowsEdition处理版本,如Pro、Ultimate等,并返回以下其中一个:

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;
请注意,如果您想进行“大于”检查,那么您应该使用其他技术。还要注意的是,版本检查往往是未来损坏的一个来源。我通常会选择警告用户并继续,这样我的二进制代码就不会在将来成为实际的破坏源

最近我尝试安装一个应用程序,安装程序检查了我的驱动器可用空间,但没有安装,因为我有超过2G的可用空间。安装程序中的32位整数有符号值变为负值,导致安装程序中断。我必须将其安装到虚拟机中才能使其正常工作。添加“智能代码”通常会使你的应用程序“更愚蠢”。小心点


顺便说一句,我发现从命令行可以运行WMIC.exe,并键入
path Win32\u OperatingSystem
(“Select*from Win32\u OperatingSystem”对我不起作用)。将来可能会扩展JCL以使用WMI信息。

在delphidabbler.com上有一个关于获取包括64位版本的操作系统版本的说明。
不过,这篇文章还没有更新到包含Vista/7。但是同样的功能可能仍然可以使用。

另请参见和@Craig FWIW,如果您包含一个标签,说明您使用的是哪一版本的Delphi,那么这个问题将更容易回答。我在过去6-7年中使用了绝地代码。最好不要自己编写代码!此外,当新版Windows Thingy问世时,JCL将由一群训练有素的猴子自动神奇地更新。只要做一个svn更新,bob就是你们的叔叔了。David Heffernan的XE2方法的优点是它和Firemonkey兼容,所以不需要任何解决方法来让它和FMX一起工作。不过,对于VCL或XE2之前的版本,我也同意绝地。Win32主版本仍然相同,次版本上升1。所以Vista+WSrv2003是“6.0”,Win7+WinServ2008是“6.1”。这太容易了。