Как установить 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-приложения?
Ответы
Ответ 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.