注意: Gabr 询问的是一种可以绕过GetVersionEx 限制的方法。 JCL 代码使用 GetVersionEx,因此受兼容层的约束。此信息仅适用于不需要绕过兼容层的人。
使用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 信息。