在 Inno Setup 中提示用户要在快捷方式中使用的文件

Prompt user in Inno Setup for file to be used in Shortcut

在 Inno Setup 中我尝试创建这个快捷方式:

"C:\Program Files (x86)\MapInfo\Professional\MapInfow.exe" "{app}\DPImap.MBX"

它适用于静态文本,但是 MapInfow.exe 的位置可能会有所不同,所以我想向用户询问。

这就是我到目前为止所做的,但是没有按预期创建快捷方式

; Default value for silent installion
#define MapInfoDefault AddBackslash(GetEnv("ProgramFiles(x86)")) + "MapInfo\Professional\MapInfow.exe"

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Icons]
Name: {group}\DPImap; Filename: {code:MapInfoExecutable} {app}\DPImap.mbx
Name: {userdesktop}\DPImap; Filename: {code:MapInfoExecutable} {app}\DPImap.mbx; Tasks: desktopicon
[Code]    

function MapInfoExecutable(Param: String): String;
var
    FileName: string;
begin
    FileName := '';
    if GetOpenFileName('Locate your MapInfo Application', FileName, ExpandConstant('{pf32}'), 'Executable (*.exe)|*.exe', 'exe') then
        Result := FileName
    else
        { Return default #MapInfoDefault if user does not provide any file }
        Result := ExpandConstant('{#MapInfoDefault}');
end;

如何提供正确的用户对话框?

应该是:

[Icons]
Name: {group}\DPImap; Filename: "{code:MapInfoExecutable}"; \
    Parameters: """{app}\DPImap.mbx"""

你也应该缓存选择的文件名,否则你得到提示至少两次,甚至更多次。

var
  FileName: string;

function MapInfoExecutable(Param: String): String;
begin
  if FileName = '' then
  begin
    if not GetOpenFileName(
        'Locate your MapInfo Application', FileName, ExpandConstant('{pf32}'),
        'Executable (*.exe)|*.exe', 'exe') then
    begin
      { Return default #MapInfoDefault if user does not provide any file }
      FileName := '{#MapInfoDefault}';
    end;
  end;
  Result := FileName;
end;

或者实际上更好,使用自定义页面,而不是在无法控制的时刻弹出的对话框。

参见

即使您喜欢该对话框,也可以在您选择的特定 page/moment 上弹出它,将所选文件名缓存到全局变量中,并在 MapInfoExecutable.[=17 中使用该变量=]


请注意,我已经从 '{#MapInfoDefault}' 中删除了 ExpandConstant - 这是胡说八道。参见