13

我无法让 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.

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

>.\Test.exe

>echo %ERRORLEVEL%
0

我预计值%ERRORLEVEL%是 42,但它没有被更新。

我在控制台应用程序中尝试了相同的实验,效果很好。为什么它不适用于我的 GUI 应用程序?

4

2 回答 2

21

您设置退出代码的方法很好。是你的测试有问题。

在提示输入下一个命令之前,shell 不会等待 GUI 应用程序完成运行。因此,错误级别已经确定。您是在显示命令提示符时检查值,而不是在运行命令时检查该值echo

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

于 2013-02-28T05:21:30.853 回答
7

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

不要在命令提示符下运行命令,而是像这样创建一个简单的 bat:

REM calltest.bat

.\Test.exe
echo %ERRORLEVEL%

然后,调用您的测试:

>calltest

我在测试中得到了这个:

>calltest.bat
>project3.exe
>echo 47

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

我的操作系统是 Win7 64,如果有什么不同的话。%errorlevel%直接从命令行打印输出 0 。

于 2013-02-28T05:00:46.293 回答