Innosetup:sspostinstall 执行了不止一次?

Innosetup: sspostinstall executed more than one time?

我尝试在 (CurrentStep = ssPostInstall)CurStepChanged 过程中执行 .exe,该 .exe 是 [Files] 部分的一部分。在我看来,好像 ssPostInstall 被执行了多次——有时甚至在安装过程的文件被处理之前。当然,我可以将 .exe 解压缩到一个临时文件夹,但我想了解它的行为令人失望。每次执行时,达到 ssPostinstall 步骤的时刻似乎都不同,有时达到不止一次。我错过了什么吗?这是我的代码的一部分:

procedure CurStepChanged(CurrentStep: TSetupStep);

var  ErrorCode : Integer;

begin
  if (CurrentStep = ssPostInstall) then begin
    if Exec(ExpandConstant('{app}\{code:getVersionSubdir}\licencing\haspdinst.exe'), '-i', '',SW_SHOW, ewWaitUntilTerminated, ErrorCode) then 
    begin
       if ErrorCode = 0 then      else
          MsgBox(SysErrorMessage(ErrorCode), mbCriticalError, MB_OK);
       end;
    end     
    else begin
         MsgBox('Did not work', mbCriticalError, MB_OK);      
    end;
end; 

提前致谢

克里斯

您代码中的嵌套和缩进使问题不明显,但如果代码缩进正确,您的消息嵌套错误就会变得更加明显。

procedure CurStepChanged(CurrentStep: TSetupStep);
var ErrorCode : Integer;
begin
  if (CurrentStep = ssPostInstall) then
  begin
    if Exec(ExpandConstant('{app}\{code:getVersionSubdir}\licencing\haspdinst.exe'), '-i', '',SW_SHOW, ewWaitUntilTerminated, ErrorCode) then
    begin
      if ErrorCode = 0 then
      else
        MsgBox(SysErrorMessage(ErrorCode), mbCriticalError, MB_OK);
    end;
  end
  else
  begin
    MsgBox('Too early? Did not work', mbCriticalError, MB_OK);
  end;
end;

请注意 ErrorCode if 块中缺少 begin/end,这意味着单个语句是有条件的。 "did not work" 消息位于 if (CurrentStep=ssPostInstall) thenelse 块中。

这样的(航空代码)怎么样:

procedure CurStepChanged(CurrentStep: TSetupStep);
var ErrorCode : Integer;
begin
  if (CurrentStep = ssPostInstall) then
  begin
    if not Exec(ExpandConstant('{app}\{code:getVersionSubdir}\licencing\haspdinst.exe'), '-i', '',SW_SHOW, ewWaitUntilTerminated, ErrorCode) then
    begin
      // Exec returned failure
      MsgBox('Did not work', mbCriticalError, MB_OK);
    end;
    else if ErrorCode <> 0 then
    begin
      // Exec returned success but non 0 error code
      MsgBox(SysErrorMessage(ErrorCode), mbCriticalError, MB_OK);
    end;
    // Else here if you want to do something on success
  end;
end;

整洁代码的重要性:p (以及为什么我从来不会错过块中的 {/}begin/end,即使不需要)