我无法让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应用程序?
答案 0 :(得分:20)
您设置退出代码的方法很好。这是你的测试错误。
在提示输入下一个命令之前,shell不会等待GUI应用程序完成运行。因此,错误级别已经建立。您在显示命令提示符时检查值,而不是在运行 echo
命令时检查。
在批处理文件或命令脚本中运行程序会修改命令解释程序的行为,使其在运行下一个命令之前等待每个命令完成,即使对于标记为使用GUI子系统而非控制台子系统的程序也是如此。这就是为什么从批处理文件中正确报告错误级别的原因 - 您运行的进程在命令解释器获取退出代码之前已完成。如果不使用命令脚本,您可以尝试使用the start
command启动程序并将/wait
选项传递给它。我不确定它是否会转发它启动的进程的退出代码。
答案 1 :(得分:6)
您可以像现在一样建立退出代码,但在控制台上,您必须在同一批次中测试%errorlevel%变量以获取值。
不要在命令提示符下运行命令,而是创建一个简单的bat,如下所示:
REM calltest.bat
.\Test.exe
echo %ERRORLEVEL%
然后,调用你的测试:
>calltest
我在测试中得到了这个:
>calltest.bat
>project3.exe
>echo 47
对于这两者,直接设置ExitCode
变量或调用Halt
。
我的操作系统是Win7 64,如果它有任何区别。直接从命令行打印%errorlevel%
将打印0。