1

我正在使用 Inno 安装程序来安装我的产品,在安装程序中,如果该程序被取消或中止,我将执行一个外部程序 (Validator.exe),我必须取消我自己的安装程序。

我将 Validator.exe 保存在 {app} 路径中并执行它。

当安装程序运行时,我调用 Validator.exe 文件并获得执行结果:Exec(ExpandConstant('{app}/Validator.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)。

但这是我尝试过的所有解决方案的问题:

InitializeSetup:Validator.exe 文件尚未复制到 {app} 中,因此永远不会执行。

中止:只能在 (InitializeSetup,InitializeWizard,CurStepChanged(ssInstall)) 中调用,因此在这些情况下验证器尚未复制。

DeinitializeSetup:我可以在安装后执行 Validator.exe,但此时我无法中止我的安装程序。

在 Validator.exe 被复制并执行后,我需要一些方法来取消安装,也许调用卸载但我做不到。

谢谢你的帮助。

4

3 回答 3

4

您可以简单地使用ExtractTemporaryFile()辅助函数在任何较早的安装步骤中提取validator.exe 。在启动设置而不是结束时查看问题inno setup extracting files以及我的答案。

于 2009-05-22T18:29:15.583 回答
2

在 Inno Setup 中,“外部”文件是包含在安装程序 EXE 文件中的文件。它存在于外部,可能作为安装程序 EXE 文件的单独文件包含在内。您说您没有AbortInitializeSetup事件中调用的原因是验证程序尚未复制到{app}目录中,这是可以理解的,因为此时用户尚未指定安装目标应该是什么。但是您不需要验证器位于目标目录中。它已经是一个外部文件,所以只需从它所在的任何目录运行它。

另一种可能性是将所需的验证功能放入 DLL。您可以在安装程序中包含 DLL,Inno Setup 会将 DLL 提取到临时位置,以便您可以从安装脚本中调用其函数。

于 2009-05-22T17:58:54.197 回答
2

谢谢它工作得很好。这就是我修复它的方法:

function InitializeSetup(): Boolean;.
var
  ResultCode : Integer;
begin
  Result := True;
  ExtractTemporaryFile('Validator.exe');

  if Exec(ExpandConstant('{tmp}\Validator.exe'), '', '', SW_SHOW,
    ewWaitUntilTerminated, ResultCode)
  then begin
    if not (ResultCode = 0) then begin
      Result := false;
    end;
  end;
end;
于 2009-05-22T19:30:39.027 回答