Installation 如何使用Inno安装程序取消安装程序?

Installation 如何使用Inno安装程序取消安装程序?,installation,inno-setup,abort,Installation,Inno Setup,Abort,我正在使用Inno安装程序安装我的产品,在安装程序中我执行一个外部程序(Validator.exe),如果该程序被取消或中止,我必须取消我自己的安装程序 我将Validator.exe保存在{app}路径中,然后执行它 安装程序运行时,我调用Validator.exe文件,并使用以下命令获得执行结果: Exec(ExpandConstant('{app}/Validator.exe'),'','',SW_SHOW,ewwaituntiltered,ResultCode) 但这就是我尝试过的所有解

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

我将Validator.exe保存在{app}路径中,然后执行它

安装程序运行时,我调用Validator.exe文件,并使用以下命令获得执行结果: Exec(ExpandConstant('{app}/Validator.exe'),'','',SW_SHOW,ewwaituntiltered,ResultCode)

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

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

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

DeinitializeSetup:我可以在安装后执行Validator.exe,但从现在起我无法中止我的安装程序

我需要一些方法来取消安装后,Validator.exe已被复制和执行,也许调用卸载,但我不能这样做

感谢您的帮助。

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

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

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


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

您只需在任何早期安装步骤中使用ExtractTemporaryFile()helper函数提取validator.exe即可。查看问题和我的答案。

您只需在任何早期安装步骤中使用ExtractTemporaryFile()助手函数即可提取validator.exe。请看问题和我的答案。

谢谢,效果非常好。我就是这样修复的:

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;

谢谢,效果很好。我就是这样修复的:

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;