Подтвердить что ты не робот

Как установить ExitCode в приложении VCL Forms

Я не могу заставить ExitCode работать для приложения форм VCL. Вот мое тестовое приложение. Он был создан из меню File/New в среде Delphi 2007 IDE. Единственное изменение заключается в том, что я добавил строку 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-приложения?

4b9b3361

Ответ 1

Ваш метод установки кода выхода в порядке. Это ваш тест, который неисправен.

Оболочка не ждет завершения работы приложений GUI перед запросом следующей команды. Таким образом, уровень ошибок уже установлен. Вы проверяете значение во время отображения командной строки, а не во время выполнения команды echo.

Запуск программ в пакетном файле или команды script изменяет поведение интерпретатора команд, чтобы он дождался завершения каждой команды до запуска следующей, даже для программ, помеченных как использование подсистемы GUI, а не подсистемы консоли, Именно поэтому уровень ошибок сообщается правильно из пакетных файлов — процесс, который вы выполнили, завершился до того, как интерпретатор команд выберет код выхода. Без использования команды script вы можете попробовать запустить свою программу с помощью команды start и передать ей опцию /wait. Я не уверен, что он пересылает код выхода процесса, который он запускает.

Ответ 2

Вы можете установить код выхода, как вы делаете, но на консоли вам нужно проверить% errorlevel% в той же партии, чтобы получить значение.

Вместо запуска команд в командной строке создайте простую летучую мышь, как это:

REM calltest.bat

.\Test.exe
echo %ERRORLEVEL%

а затем вызовите тест:

>calltest

Я получил это в своем тесте:

>calltest.bat
>project3.exe
>echo 47

Для обоих параметров, непосредственно устанавливая переменную ExitCode или вызывающую Halt.

Моя ОС - Win7 64, если это имеет значение. Печать %errorlevel% непосредственно из командной строки печатает 0.