任何人都可以帮我检测用户可能使用的Windows版本吗?
我已经看到了一些示例,但它们没有针对Vista/7操作系统进行更新.
另外,检测操作系统是在x32还是x64架构上运行会很有用.
提前致谢.
Dav*_*nan 36
在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
检查,如果当时的OS超过某一版本级别.虽然您应该在Delphi中检查该函数是否正常工作,因为Delphi 6及更早版本中该函数的实现是不正确的.
要了解本机OS体系结构(32位或64位),请使用该GetNativeSystemInfo
功能.此功能在较旧的操作系统上不可用,因此您应该明确加载它GetProcAddress
.测试wProcessorArchitecture=PROCESSOR_ARCHITECTURE_AMD64
检查64位操作系统.
War*_* P 10
即使在早于XE2的版本上,JEDI JCL也已经这样做了.请参阅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);
Run Code Online (Sandbox Code Playgroud)
如果您想知道是否运行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);
Run Code Online (Sandbox Code Playgroud)
对于历史兴趣,您也可以使用NtProductType函数检查NT级版本,它返回:
TNtProductType = (ptUnknown, ptWorkStation, ptServer, ptAdvancedServer,
ptPersonal, ptProfessional, ptDatacenterServer,
ptEnterprise, ptWebEdition);
Run Code Online (Sandbox Code Playgroud)
请注意,上面检测到"N个版本".这是由欧盟反垄断法规创建的欧盟(欧洲)版Windows.这是JCL内部非常精细的检测级别.
这是一个示例函数,可以帮助您检测Vista,并在Vista上做一些特殊的事情.
function IsSupported:Boolean;
begin
case GetWindowsVersion of
wvVista: result := false;
else
result := true;
end;
end;
Run Code Online (Sandbox Code Playgroud)
请注意,如果您想要"大于"检查,那么您应该使用其他技术.另请注意,版本检查通常可能是未来破损的来源.我通常选择警告用户并继续,这样我的二进制代码将来不会成为破坏的实际来源.
最近我尝试安装一个应用程序,安装程序检查了我的驱动器可用空间,并且无法安装,因为我有超过2千兆字节的可用空间.安装程序中的32位整数签名值变为负数,从而破坏了安装程序.我不得不将它安装到VM中以使其工作.添加"智能代码"通常会使您的应用程序"愚蠢".警惕.
顺便说一句,我发现从命令行,您可以运行WMIC.exe,并键入path Win32_OperatingSystem
("Select*from Win32_OperatingSystem"对我来说不起作用).将来也许JCL可以扩展为使用WMI信息.
归档时间: |
|
查看次数: |
23114 次 |
最近记录: |