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选项.不过,我不确定它是否会转发它启动的进程的退出代码.
您可以像正在执行的那样建立退出代码,但是在控制台上,您必须在同一批次中测试%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.