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) then
的 else
块中。
这样的(航空代码)怎么样:
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
,即使不需要)
我尝试在 (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) then
的 else
块中。
这样的(航空代码)怎么样:
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
,即使不需要)