获取Windows版本?

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

我已经看到了一些例子来做到这一点,但是他们没有更新Vista / 7操作系统。

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

提前致谢。

Solutions Collecting From Web of "获取Windows版本?"

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

  • 阅读TOSVersion.Architecture检查32或64位操作系统。
  • 阅读TOSVersion.Platform以检查Windows或Mac。
  • 请阅读TOSVersion.MajorTOSVersion.Minor以了解版本号。
  • 阅读TOSVersion.Name以获取基本产品名称,例如Windows 7。
  • 阅读TOSVersion.ToString以获取带有版本的完整产品名称,例如Windows 7 Service Pack 1(V6.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位操作系统。

JEDI JCL已经这样做了,即使在比XE2更早的版本上。 有关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,它返回其中之一:

 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位整数有符号值变为负值,从而中断了安装程序。 我必须将其安装到虚拟机才能使其工作。 添加“智能代码”往往使您的应用程序“笨蛋”。 警惕。

顺便说一句,我发现从命令行,你可以运行WMIC.exe,并键入path Win32_OperatingSystem (“选择*从Win32_OperatingSystem”没有为我工作)。 将来也许JCL可以扩展到使用WMI信息。

此处显示的单位(GetWinVersionInfo)可检测到Vista。 我无法想象为Windows 7更新它将会很困难。 我不认为它告诉你x86.x64。

在delphidabbler.com上有一个关于获取操作系统版本(包括64位版本)的完整文章 。 文章没有被更新包括Vista / 7。 但是相同的功能可能仍然有效。