32

到目前为止,这是我的代码的 [Files] 部分:

[Files]
Source: "other_installer.exe"; DestDir: "{app}"
Source: "myprogram.exe"; DestDir: "{app}"
Source: "data.dat"; DestDir: "{app}"
Source: "otherdata.dat"; DestDir: "{app}"

我的程序依赖于另一个程序来运行。我已经在我的安装程序中包含了这个程序的安装程序(“other_installer.exe”)。我想做的是在复制后立即启动此安装程序,然后继续使用“myprogram.exe”和其余部分。

我用谷歌搜索并在 Inno Setup Help 中找到了 BeforeInstall 的文档,但他们没有运行另一个应用程序的示例。我相信它应该是这样的:

[Files]
Source: "other_installer.exe"; DestDir: "{app}"
Source: "myprogram.exe"; DestDir: "{app}"; BeforeInstall: // RUN OTHER_INSTALLER.EXE //
Source: "data.dat"; DestDir: "{app}"
Source: "otherdata.dat"; DestDir: "{app}"
4

3 回答 3

44

更好的方式可能是AfterInstall参数。以下脚本将在处理文件条目RunOtherInstaller后立即执行该函数。OtherInstaller.exe它在那里尝试执行刚刚安装的OtherInstaller.exe文件,如果失败,它会向用户报告错误消息。请注意,您不能从该功能中断安装,因此以这种方式执行您想要的操作并不安全:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: "OtherInstaller.exe"; DestDir: "{app}"; AfterInstall: RunOtherInstaller
Source: "OtherFile.dll"; DestDir: "{app}"

[Code]
procedure RunOtherInstaller;
var
  ResultCode: Integer;
begin
  if not Exec(ExpandConstant('{app}\OtherInstaller.exe'), '', '', SW_SHOWNORMAL,
    ewWaitUntilTerminated, ResultCode)
  then
    MsgBox('Other installer failed to run!' + #13#10 +
      SysErrorMessage(ResultCode), mbError, MB_OK);
end;
于 2013-10-25T12:33:17.533 回答
15

另一个运行必备安装程序的好时机是在PrepareToInstall事件函数中。(基本结构见 Inno 提供的示例脚本,实际执行见 TLama 的代码。)

的主要优点PrepareToInstall是它允许您处理来自子安装程序的错误和重新启动请求 - 使用AfterInstall不会。

它的主要缺点是您必须手动ExtractTemporaryFile执行运行子安装所需的任何操作,因为这发生在提取文件之前。

于 2013-10-27T18:34:13.913 回答
1

您可以使用 AfterInstall,在帮助中查找。刚刚复制文件时,我将启动您设置为“AfterInstall:”的功能/程序。

在此功能/过程中,使用 Exec 并启动其他安装程序。

于 2013-10-25T12:48:32.913 回答