9

我正在使用 Inno Setup 来更改操作系统中的回收站。如果用户运行的是 Windows 7 或 Windows XP,我需要做一些案例。我尝试使用:

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

但它似乎无法找到imageres.dll,或者shell32.dll即使我已经证实它们存在。我究竟做错了什么?或者我可以通过其他方式检查 Windows 版本吗?

4

3 回答 3

16

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

[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;

要测试 Windows 的服务器版本,请参阅:
检查 Windows Server 2003


要使版本检查在现代版本的 Windows 上正常工作,请确保始终使用最新版本的 Inno Setup。

于 2016-07-10T13:40:53.560 回答
11

您应该使用该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;

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

于 2011-05-01T18:37:55.660 回答
7

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

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

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

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

于 2011-05-01T18:44:26.040 回答