如何在VCL Forms应用程序中设置ExitCode

dan*_*gph 12 delphi vcl exit-code return-code

我无法让ExitCode适用于VCL表单应用程序.这是我的测试应用程序.它是从Delphi 2007 IDE的File/New菜单创建的.唯一的变化是我ExitCode := 42;在最后添加了这一行.

program Test;

uses
  Forms,
  Unit27 in 'Unit27.pas' {Form27};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm27, Form27);
  Application.Run;

  ExitCode := 42;
end.
Run Code Online (Sandbox Code Playgroud)

现在,当我从命令行运行它时,%ERRORLEVEL%没有设置:

>.\Test.exe

>echo %ERRORLEVEL%
0
Run Code Online (Sandbox Code Playgroud)

我被期望值%ERRORLEVEL%为42,但它没有被更新.

我在控制台应用程序中尝试了相同的实验,并且工作正常.为什么它不能用于我的GUI应用程序?

Rob*_*edy 21

您设置退出代码的方法很好.这是你的测试,这是错误的.

在提示输入下一个命令之前,shell不会等待GUI应用程序完成运行.因此,错误级别已经建立.你在检查中显示命令提示符时的价值,而不是在时间,你echo命令.

在批处理文件或命令脚本运行的程序修改命令解释器的行为,使其等待每个命令将运行的下一个前完成,即使是标记为使用GUI子系统,而不是控制台子系统的方案.这就是为什么从批处理文件中正确报告错误级别的原因 - 您运行的进程在命令解释器获取退出代码之前已完成.如果不使用命令脚本,你可以尝试用你的启动程序start命令,并通过它的/wait选项.不过,我不确定它是否会转发它启动的进程的退出代码.


jac*_*ate 6

您可以像正在执行的那样建立退出代码,但是在控制台上,您必须在同一批次中测试%errorlevel%变量以获取值.

不要在命令提示符中运行命令,而是创建一个简单的bat,如下所示:

REM calltest.bat

.\Test.exe
echo %ERRORLEVEL%
Run Code Online (Sandbox Code Playgroud)

然后,调用你的测试:

>calltest
Run Code Online (Sandbox Code Playgroud)

我在测试中得到了这个:

>calltest.bat
>project3.exe
>echo 47
Run Code Online (Sandbox Code Playgroud)

对于两者,直接设置ExitCode变量或调用Halt.

我的操作系统是Win7 64,如果它有任何区别.印刷%errorlevel%直接从命令行打印0.