13

VCL フォーム アプリケーションで ExitCode を機能させることができません。これが私のテストアプリケーションです。これは、Delphi 2007 IDE の File / New メニューから作成されました。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 アプリケーションで機能しないのはなぜですか?

4

2 に答える 2

21

終了コードを設定する方法は問題ありません。間違っているのはあなたのテストです。

シェルは、GUI アプリケーションの実行が完了するのを待たずに、次のコマンドを要求します。したがって、エラーレベルはすでに確立されています。コマンドを実行した時点ではなく、コマンド プロンプトが表示された時点で値を確認していますecho

バッチ ファイルまたはコマンド スクリプトでプログラムを実行すると、コンソール サブシステムではなく GUI サブシステムを使用するようにマークされたプログラムであっても、コマンド インタープリターの動作が変更され、各コマンドが終了するのを待ってから次のコマンドが実行されます。そのため、バッチ ファイルからエラー レベルが正しく報告されます。実行したプロセスは、コマンド インタープリターが終了コードを取得する前に終了しています。コマンド スクリプトを使用せずに、startコマンドを使用してプログラムを起動し、オプションを渡すことが/waitできます。ただし、開始するプロセスの終了コードを転送するかどうかはわかりません。

于 2013-02-28T05:21:30.853 に答える
7

実行しているのと同じように終了コードを確立できますが、コンソールでは、同じバッチで %errorlevel% 変数をテストして値を取得する必要があります。

コマンド プロンプトでコマンドを実行する代わりに、次のような単純なバットを作成します。

REM calltest.bat

.\Test.exe
echo %ERRORLEVEL%

次に、テストを呼び出します。

>calltest

テストでこれを得ました:

>calltest.bat
>project3.exe
>echo 47

どちらの場合も、変数を直接設定するExitCodeか、 を呼び出しHaltます。

違いがあれば、私のOSはWin7 64です。%errorlevel%コマンド ラインから直接印刷すると、0 が印刷されます。

于 2013-02-28T05:00:46.293 に答える