确定Inno Setup中的Windows版本

我正在使用Inno安装程序来更改操作系统中的回收站。 如果用户正在运行Windows 7或Windows XP,我需要做一些事情。 我尝试使用:

if not FileExists(winDir + '\System32\imageres.dll') then if not FileExists(winDir + '\System32\shell32.dll') then installError(3); 

但它似乎无法findimageres.dllshell32.dll即使我已经validation它们存在。 我究竟做错了什么? 或者我可以另一种方式检查Windows版本?

Solutions Collecting From Web of "确定Inno Setup中的Windows版本"

您应该使用GetWindowsVersionEx函数。 它填充TWindowsVersion记录:

 TWindowsVersion = record Major: Cardinal; // Major version number Minor: Cardinal; // Minor version number Build: Cardinal; // Build number ServicePackMajor: Cardinal; // Major version number of service pack ServicePackMinor: Cardinal; // Minor version number of service pack NTPlatform: Boolean; // True if an NT-based platform ProductType: Byte; // Product type (see below) SuiteMask: Word; // Product suites installed (see below) end; 

还有很多其他的相关功能。 请参阅本页面下方的“系统功能”。

根据文档 ,与每个文件相关的参数可以直接绑定到操作系统版本上:

 [Files] Source: "{app}\WinNT2000XP.exe"; DestDir: "{app}"; MinVersion: 0, 1 Source: "{app}\Win9598Me.exe"; DestDir: "{app}"; MinVersion: 1, 0 

“0”表示不安装; “1”表示安装在任何版本(即1.0或更高版本)上。

注意:上述技术不限于[文件]部分; MinVersion和OnlyBelowVersion可以用于大多数部分。

在大多数Inno Setup部分(如[Files][Tasks][Run]等)中,您可以使用MinVersionOnlyBelowVersion公共参数 。

 [Files] Source: MyDllForVistaAndNewer.dll; Dest: {app}\MyDll.dll; MinVersion: 6.0 Source: MyDllForOldWindows.dll; Dest: {app}\MyDll.dll; OnlyBelowVersion: 6.0 

在Pascal脚本中,使用GetWindowsVersionEx函数查找Windows版本号。 然后将该数字与特定的Windows版本号进行比较 。

这里有几个方便的功能来检查特定的Windows版本:

 function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean; var Version: TWindowsVersion; begin GetWindowsVersionEx(Version); Result := (Version.Major > Major) or ((Version.Major = Major) and (Version.Minor >= Minor)); end; function IsWindowsXPOrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(5, 1); end; function IsWindowsVistaOrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 0); end; function IsWindows7OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 1); end; function IsWindows8OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 2); end; function IsWindows10OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(10, 0); end; 

使用示例:

 function InitializeSetup: Boolean; begin if not IsWindowsVistaOrNewer then begin MsgBox( 'This program was not tested on Windows XP and older, proceed with caution.', mbCriticalError, MB_OK); end; Result := True; end;