【发布时间】:2011-12-29 23:37:43
【问题描述】:
谁能帮我检测一下用户可能使用的是哪个版本的 Windows?
我已经看到了一些执行此操作的示例,但它们没有针对 Vista/7 操作系统进行更新。
此外,检测操作系统是在 x32 还是 x64 架构上运行会很有用。
提前致谢。
【问题讨论】:
-
@Craig FWIW,如果您包含一个指定您使用的 Delphi 版本的标签,这个问题会更容易回答
谁能帮我检测一下用户可能使用的是哪个版本的 Windows?
我已经看到了一些执行此操作的示例,但它们没有针对 Vista/7 操作系统进行更新。
此外,检测操作系统是在 x32 还是 x64 架构上运行会很有用。
提前致谢。
【问题讨论】:
here 显示的单元 (GetWinVersionInfo) 检测到 Vista。我无法想象为 Windows 7 更新它会那么困难。我认为它不会告诉你 x86.x64。
【讨论】:
在 XE2 上引入了一个新类来处理这个问题:TOSVersion。
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,Build 7601,64 位版本)。对于旧版本的 Delphi,我建议如下:
为了检查 2000、XP、Vista、7,我建议你阅读 Win32MajorVersion 和 Win32MinorVersion。
MSDN 上提供了相同的信息,但以上信息来自我的脑海!
如果您想要非常详细的产品信息,那么这需要更多的工作。沃伦的回答提供了一种获取该信息的好方法。如果您想测试功能,那么版本号就可以了。
使用CheckWin32Version 检查当前操作系统是否超过了某个版本级别。尽管您应该检查该函数在您的 Delphi 中是否正常工作,因为该函数在 Delphi 6 和更早版本中的实现是不正确的。
要了解本机操作系统架构是什么(32 位或 64 位),请使用 GetNativeSystemInfo 函数。此功能在较旧的操作系统上不可用,因此您应该使用GetProcAddress 显式加载它。测试 wProcessorArchitecture=PROCESSOR_ARCHITECTURE_AMD64 以检查 64 位操作系统。
【讨论】:
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 信息。
【讨论】:
在 delphidabbler.com 上有一个 complete article 关于获取包括 64 位版本在内的操作系统版本。 这篇文章还没有更新到包括 Vista/7。但同样的功能可能仍然有效。
【讨论】: