Как установить ExitCode в приложении VCL Forms
Я не могу заставить ExitCode работать для приложения форм VCL. Вот мое тестовое приложение. Он был создан из меню Файл / Новое в интегрированной среде разработки Delphi 2007. Единственное изменение заключается в том, что я добавил строку 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, но он не обновляется.
Я попробовал тот же эксперимент в консольном приложении, и это сработало нормально. Почему это не работает для моего приложения с графическим интерфейсом?
2 ответа
Ваш метод установки кода выхода в порядке. Это ваш тест, который неисправен.
Оболочка не ожидает завершения работы приложений с графическим интерфейсом, прежде чем запрашивать следующую команду. Таким образом, уровень ошибки уже установлен. Вы проверяете значение во время отображения командной строки, а не во время запуска echo
команда.
Запуск программ в командном файле или командном сценарии изменяет поведение интерпретатора команд, заставляя его ждать завершения каждой команды перед запуском следующей, даже для программ, помеченных как использующие подсистему GUI вместо консольной подсистемы. Вот почему уровень ошибок правильно отображается в пакетных файлах - процесс, который вы запустили, завершился до того, как интерпретатор команд извлек код завершения. Не используя командный скрипт, вы можете попробовать запустить вашу программу с start
команда и передать его /wait
вариант. Я не уверен, что он перенаправляет код завершения процесса, который он запускает.
Вы можете установить код выхода, как вы делаете, но на консоли вы должны проверить переменную%errorlevel% в том же пакете, чтобы получить значение.
Вместо запуска ваших команд в командной строке, создайте простой bat, как это:
REM calltest.bat
.\Test.exe
echo %ERRORLEVEL%
и затем вызовите ваш тест:
>calltest
Я получил это в моем тесте:
>calltest.bat
>project3.exe
>echo 47
Для обоих, установка непосредственно ExitCode
переменная или вызов Halt
,
Моя ОС - Win7 64, если это имеет значение. Печать %errorlevel%
прямо из командной строки печатает 0.