2013-02-28 4 views
11

Я не могу заставить ExitCode работать для приложения форм VCL. Вот мое тестовое приложение. Он был создан из меню File/New в среде Delphi 2007 IDE. Единственное изменение заключается в том, что я добавил строку ExitCode := 42; в конце.Как установить ExitCode в приложении VCL Forms

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?

ответ

19

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

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

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

+1

Ха, это очевидно, оглядываясь назад. Благодарю. –

5

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

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

REM calltest.bat 

.\Test.exe 
echo %ERRORLEVEL% 

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

>calltest 

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

>calltest.bat 
>project3.exe 
>echo 47 

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

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

+0

Спасибо @jachguate. –

Смежные вопросы