在 Inno Setup 中为 运行 不同版本的 Windows 不同程序创建图标

Create icons for and run different programs on different versions of Windows in Inno Setup

我想在 [Icons][Run] 部分的安装过程中使用代码变量来决定,但我不知道我是否错了。

我的 [Code] 部分是:

[Code]
var 
  myW7Val: string;

function GetMyW7Val(Value: string): string;
begin
  Result := myW7Val;
end;

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 IsWindows8OrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(6, 2);
  if not Result then
    myW7Val := '1';  
  myW7Val := '0';
end;

function InitializeSetup: Boolean;
begin
  IsWindows8OrNewer
  Result := True;
end;

我的 [Icons] 部分是:

[Icons]
#if "{code:GetMyW7Val}" == '0'
  Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
  Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; \
    Tasks: desktopicon
  Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; \
    Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
#elif "{code:GetMyW7Val}" == '1'
  Name: "{autoprograms}\{#MyAppLanceurName}"; \
    Filename: "{app}\{#MyAppLanceurExeName}"
  Name: "{autodesktop}\{#MyAppLanceurName}"; \
    Filename: "{app}\{#MyAppLanceurExeName}"; Tasks: desktopicon
  Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppLanceurName}"; \
    Filename: "{app}\{#MyAppLanceurExeName}"; Tasks: quicklaunchicon
#endif

如果 myW7Val0,我想使用前三个条目,如果 myW7Val1,我想使用其他条目。但是目前我有一个错误,没有值。

你有什么想法吗?

提前致谢

要回答您的字面问题,请使用 Check parameter:

[Code]
function IsWindows8OrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(6, 2);
end;
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; \
  Check: not IsWindows8OrNewer 
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; \
  Tasks: desktopicon; Check: not IsWindows8OrNewer 
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; \
  Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon; \
  Check: not IsWindows8OrNewer 

Name: "{autoprograms}\{#MyAppLanceurName}"; \
  Filename: "{app}\{#MyAppLanceurExeName}"; Check: IsWindows8OrNewer 
Name: "{autodesktop}\{#MyAppLanceurName}"; \
  Filename: "{app}\{#MyAppLanceurExeName}"; Tasks: desktopicon; \
  Check: IsWindows8OrNewer 
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppLanceurName}"; \
  Filename: "{app}\{#MyAppLanceurExeName}"; Tasks: quicklaunchicon; \
  Check: IsWindows8OrNewer 

虽然这有点矫枉过正,但对于特定 Windows 版本的 selecting 条目有 MinVersion and OnlyBelowVersion parameters

[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; \
  OnlyBelowVersion: 6.2
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; \
  Tasks: desktopicon; OnlyBelowVersion: 6.2
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; \
  Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon; \
  OnlyBelowVersion: 6.2
 
Name: "{autoprograms}\{#MyAppLanceurName}"; \
  Filename: "{app}\{#MyAppLanceurExeName}"; MinVersion: 6.2 
Name: "{autodesktop}\{#MyAppLanceurName}"; \
  Filename: "{app}\{#MyAppLanceurExeName}"; Tasks: desktopicon; \
  MinVersion: 6.2
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppLanceurName}"; \
  Filename: "{app}\{#MyAppLanceurExeName}"; Tasks: quicklaunchicon; MinVersion: 6.2

或者,您可以使用 scripted constant 到 select 应用程序名称和文件名,以避免重复 Icons 条目:

[Code]
function IsWindows8OrNewer: Boolean;
begin
  Result := IsWindowsVersionOrNewer(6, 2);
end;

function GetAppName(Param: string): string;
begin
  if IsWindows8OrNewer then Result := '{#MyAppLanceurName}'
    else Result := '{#MyAppName}';
end;

function GetAppExeName(Param: string): string;
begin
  if IsWindows8OrNewer then Result := '{#MyAppLanceurExeName}'
    else Result := '{#MyAppExeName}';
end;
[Icons]
Name: "{autoprograms}\{code:GetAppName}"; Filename: "{app}\{code:GetAppExeName}"
Name: "{autodesktop}\{code:GetAppName}"; Filename: "{app}\{code:GetAppExeName}"; \
  Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{code:GetAppName}"; \
  Filename: "{app}\{code:GetAppExeName}"; Tasks: quicklaunchicon