Inno Setup 让用户选择将扩展与哪个应用程序关联

Inno Setup give user choice of which application to associate extensions with

我有一个安装项目,它安装了三个不同的可执行文件。

我想为用户提供将多个文件扩展名与其中一个 exe 或 none 相关联的选项。这可能吗,如果可能的话如何?

我目前用来将单个程序与文件扩展名相关联的代码是:

[Registry]
Root: HKCR; Subkey: "program1\DefaultIcon"; ValueType: string; \    
    ValueName: ""; ValueData: "{app}\program1.EXE,0"
Root: HKCR; Subkey: "program1\shell\open\command"; ValueType: string; \
    ValueName: ""; ValueData: """{app}\program1.exe"" ""%1"""

您可以使用 "Tasks" 呈现 select 离子。

例如:

[Tasks]
Name: associate; Description: "Associate application with extension"
Name: associate\app1; Description: "Application 1"; Flags: exclusive
Name: associate\app2; Description: "Application 2"; Flags: exclusive unchecked
Name: associate\app3; Description: "Application 3"; Flags: exclusive unchecked


然后在相应的部分使用Task parameter来select注册的正确操作。

在你的情况下(协会),它可以是


您的 [Registry] 部分条目示例:

[Registry]
Root: HKCR; Subkey: "program1\DefaultIcon"; ValueType: string; ValueName: ""; \
    ValueData: "{app}\program1.EXE,0"; Tasks: associate\app1
Root: HKCR; Subkey: "program1\shell\open\command"; ValueType: string; ValueName: ""; \
    ValueData: """{app}\program1.exe"" ""%1"""; Tasks: associate\app1

Root: HKCR; Subkey: "program1\DefaultIcon"; ValueType: string; ValueName: ""; \
    ValueData: "{app}\program2.EXE,0"; Tasks: associate\app2
Root: HKCR; Subkey: "program1\shell\open\command"; ValueType: string; ValueName: ""; \
    ValueData: """{app}\program2.exe"" ""%1"""; Tasks: associate\app2

Root: HKCR; Subkey: "program1\DefaultIcon"; ValueType: string; ValueName: ""; \
    ValueData: "{app}\program3.EXE,0"; Tasks: associate\app3
Root: HKCR; Subkey: "program1\shell\open\command"; ValueType: string; ValueName: ""; \
    ValueData: """{app}\program3.exe"" ""%1"""; Tasks: associate\app3

(我不确定你的 program1 密钥,它不应该是扩展名或文件类型吗?)


为避免重复几乎相同的 Registry 条目,您可以使用 scripted constant:

[Registry]
Root: HKCR; Subkey: "program1\DefaultIcon"; ValueType: string; ValueName: ""; \
    ValueData: "{app}\{code:AssociateExecutable},0"; Tasks: associate
Root: HKCR; Subkey: "program1\shell\open\command"; ValueType: string; ValueName: ""; \
    ValueData: """{app}\{code:AssociateExecutable}"" ""%1"""; Tasks: associate

[Code]

function AssociateExecutable(Param: string): string;
begin
  if IsTaskSelected('associate\app1') then Result := 'program1.exe'
    else
  if IsTaskSelected('associate\app2') then Result := 'program2.exe'
    else
  if IsTaskSelected('associate\app3') then Result := 'program3.exe'
    else
  begin
    Log('No application selected, this should not happen');
    Result := '';
  end;
end;