How to set ExitCode in a VCL Forms Application
Asked Answered
P

2

15

I can't get ExitCode to work for a VCL forms application. Here is my test application. It was created from the File / New menu in the Delphi 2007 IDE. The only change is that I added the line ExitCode := 42; at the end.

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.

Now, when I run it from the command line, %ERRORLEVEL% doesn't get set:

>.\Test.exe

>echo %ERRORLEVEL%
0

I was expected the value in %ERRORLEVEL% to be 42, but it isn't being updated.

I tried the same experiment in a console application, and that worked fine. Why isn't it working for my GUI application?

Pewee answered 28/2, 2013 at 4:47 Comment(0)
D
23

Your method of setting the exit code is fine. It's your test that's faulty.

The shell doesn't wait for GUI applications to finish running before prompting for the next command. Thus, the error level has already been established. You're checking the value at the time the command prompt was displayed, not at the time you ran the echo command.

Running programs in a batch file or command script modifies the behavior of the command interpreter to make it wait for each command to finish before running the next one, even for programs marked as using the GUI subsystem instead of the console subsystem. That's why the error level is reported correctly from batch files — the process you ran had finished before the command interpreter fetches the exit code. Without using a command script, you can try starting your program with the start command and passing it the /wait option. I'm not sure it forwards the exit code of the process it starts, though.

Diligence answered 28/2, 2013 at 5:21 Comment(1)
Hah, that's kind of obvious in hindsight. Thanks.Pewee
P
9

You can establish the exit code like you're doing, but on the console you have to test the %errorlevel% variable in the same batch to get the value.

Instead of running your commands in the command prompt, create a simple bat like this:

REM calltest.bat

.\Test.exe
echo %ERRORLEVEL%

and then, invoke your test:

>calltest

I got this in my test:

>calltest.bat
>project3.exe
>echo 47

For both, setting directly the ExitCode variable or calling Halt.

My OS is Win7 64, if it makes any difference. Printing the %errorlevel% directly from the command line prints 0.

Palaeolithic answered 28/2, 2013 at 5:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.