首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取Windows版本?

获取Windows版本?
EN

Stack Overflow用户
提问于 2011-11-16 07:25:22
回答 4查看 26.2K关注 0票数 17

是否有人可以帮助我检测用户可能正在使用的Windows版本?

我见过一些这样做的例子,但它们没有针对Vista/7操作系统进行更新。

此外,检测操作系统是否在x32或x64体系结构上运行将非常有用。

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-16 07:37:52

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

  • 读取TOSVersion.Architecture以检查32位或64位操作系统。
  • 读取TOSVersion.Platform以检查Windows或Mac。
  • 读取TOSVersion.MajorTOSVersion.Minor以获取基本产品名称,例如Windows7。
  • 读取TOSVersion.ToString以获取包含版本的完整产品名称,例如Windows7 Service Pack1(版本6.1,内部版本号7601,64位版本)。

对于旧版本的Delphi,我推荐以下几点:

为了检查2000、XP、Vista7,我建议你阅读Win32MajorVersionWin32MinorVersion

XP

  • major.minor

  • major.minor= 5.0 => Windows XP

  • major.minor= 5.1 => Windows 2003服务器或

  • = 6.0 => Windows Vista/2008服务器= 6.1 => Windows 7/2008服务器R2

同样的信息也可以在MSDN上找到,但上面的内容是我自己想出来的!

如果你想要非常详细的产品信息,那么这需要更多的工作。沃伦的回答给出了一个很好的获取信息的途径。如果你想测试功能,那么版本号是很好的。

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

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

票数 37
EN

Stack Overflow用户

发布于 2011-11-16 08:07:37

JEDI JCL已经做到了这一点,甚至在比XE2更早的版本上也是如此。请参阅XE2及更高版本中内置解决方案的David答案。

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

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

代码语言:javascript
运行
复制
  TWindowsVersion =
   (wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME,
    wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,
    wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008,
    wvWin7, wvWinServer2008R2);

如果你想知道你运行的是64位的windows7而不是32位的windows7,那么调用JclSysInfo.IsWindows64

请注意,JCL allso为调用GetWindowsEdition处理版本,如专业版、旗舰版等,并返回以下内容之一:

代码语言:javascript
运行
复制
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级版本,它将返回:

代码语言:javascript
运行
复制
 TNtProductType =       (ptUnknown, ptWorkStation, ptServer, ptAdvancedServer,        
        ptPersonal, ptProfessional, ptDatacenterServer, 
        ptEnterprise, ptWebEdition);

请注意,上面检测到了"N个版本“。这是一个欧盟(欧洲)版本的Windows,是根据欧盟的反垄断法规创建的。这是JCL内部检测的一个很好的层次。

这里有一个示例函数,它将帮助您检测Vista,并在Vista上做一些特殊的事情。

代码语言:javascript
运行
复制
function IsSupported:Boolean;
begin
  case GetWindowsVersion of
     wvVista:  result := false; 
    else
      result := true;
  end;
end;

请注意,如果您想做“大于”检查,那么您应该只使用其他技术。还要注意的是,版本检查通常是未来破坏的一个来源。我通常选择警告用户并继续,这样我的二进制代码就不会成为未来破坏的真正来源。

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

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

票数 10
EN

Stack Overflow用户

发布于 2011-11-16 07:37:16

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8144599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档