如何在Inno Setup中设置退出代码?

8
我想为我的安装程序设置退出代码,这样我就可以知道为什么安装被中止了。我正在使用Inno Setup。
3个回答

15

从Inno Setup帮助文档(来自文章“安装程序退出代码”)中:

从Inno Setup 3.0.3开始,安装程序可能返回以下其中之一的退出代码:

0 安装成功完成。

1 安装未能初始化。

2 用户在实际安装开始之前单击向导中的“取消”,或在开启“这将安装…”消息框时选择“否”。

3 在准备转移到下一个安装阶段时(例如,从显示预安装向导页面到实际安装过程),发生致命错误。除非出现最不寻常的情况(例如内存或Windows资源耗尽),否则不应该发生这种情况。

4 在实际安装过程中发生致命错误。

注意:导致显示“中止-重试-忽略”框的错误不是致命错误。如果用户在这样的消息框中选择“中止”,则会返回退出代码5

5 用户在实际安装过程中单击“取消”,或在“中止-重试-忽略”框中选择“中止”。

6 调试器(在IDE中使用“运行|终止”)强制终止了安装程序进程。

您可以通过确认退出代码为0来轻松检查安装是否成功完成。此外:

任何非零的退出代码都表示安装程序未能成功完成。

更具体地回答你的问题,你可以通过观察退出代码25来确定安装是否被取消。

如果你希望在Inno本应返回0时返回自定义的退出代码,你可以定义以下事件函数:

function GetCustomSetupExitCode: Integer;

从帮助文档中(来自文章"Pascal脚本编程:事件函数"):

function GetCustomSetupExitCode: Integer;

返回一个非零数字以指示安装程序返回自定义退出代码。只有在安装成功完成且退出代码为0时才会调用此函数。


3
我知道了,我已经相应地修改了我的答案。请注意,只有在Inno本来会以 0 退出时,你才能定义自定义的退出代码! - Paul Lammertsma
有没有办法做相反的操作?指定当Inno返回“!0”时返回“0”? - v.oddou
@v.oddou 我不相信这是可能的,除非有一种拦截退出并使用Lepe的答案强制结束进程的方法。 - Paul Lammertsma
可能有一种方法是将exe包装到另一个总是返回0的exe中。但最终对于我的情况,我只是设置父安装程序忽略返回代码。(否则,当取消子安装程序(使用Inno制作)时,它会回滚所有内容) - v.oddou
1
如果你使用的是Windows系统,请参考这个答案。在其他平台上,之前的退出代码会简单地返回到$?中。 - Paul Lammertsma
显示剩余2条评论

8

使用:

[Code]
procedure ExitProcess(exitCode:integer);
  external 'ExitProcess@kernel32.dll stdcall';

procedure SomeEventHere();
begin
  if someerror then begin
    ExitProcess(9); //Your custom exit code
  end;
end;

这可能会留下临时文件,因为常规的Inno Setup清理代码不会运行。 - zett42

0
我曾经有同样的问题,并找到了解决办法:
[Code]
var CustomExitCode: integer;

procedure ExitProcess(exitCode:integer);
    external 'ExitProcess@kernel32.dll stdcall';

procedure DeinitializeSetup();
begin
    if (CustomExitCode <> 0) then
    begin
        DelTree(ExpandConstant('{tmp}'), True, True, True);
        ExitProcess(CustomExitCode);
    end;
end;

现在,在您的设置的任何位置,只需将CustomExitCode设置为您想要的代码。 示例:
function InitializeSetup: Boolean;
begin
    // Some check did fail, exiting with custom code
    CustomExitCode = -1;
    
    // Let's just close the setup
    Result := false;
end;

这样设置就不会突然终止,无论向导退出时处于什么状态,您都可以自定义退出代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接