7

このプログラムがメッセージボックスを正しく表示するのに、エラーレベルを設定しないのはなぜですか?

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
  MessageBox(NULL, _T("This should return 90 no?"), _T("OK"), MB_OK);
  return 90;
}

上記のコードを、a.exeという実行可能ファイルという名前にコンパイルしました。私はコマンドプロンプトでこれを行いました:

c:\> a.exe 
 (message box is displayed, I press ok)
c:\> echo %ERRORLEVEL% 
  0

exit(90);返品直前に使用しても同じ結果になります。それはまだ言い0ます。

また、を介してプログラムを開始しCreateProcess、で結果を取得しようとしましGetExitCodeProcessたが、それも返さ0れます。エラーチェックを行って、すべてが正しく開始されたことを確認しました。

私はもともとこの問題をより複雑なプログラムで見たので、この単純なプログラムを作成して問題を検証しました。結果は同じで、両方のプログラムはWinMain常にを返し0ます。

x64、x86、およびユニコードとMBCSのコンパイルオプションの両方を試しました。すべて0エラーレベル/ステータスコードとして表示されます。

4

2 に答える 2

15

プログラムがコンソール アプリではなく Windows アプリである場合、コマンド インタープリターは完了を待ちません ([OK] を押す前にコマンド ウィンドウを確認すると、次のコマンドの準備ができていることがわかります)。 )。

この場合、アプリケーションをコンソール サブシステム アプリとしてビルドすると問題が解決します。Windows アプリとして実行する必要がある場合は、コマンドが完了するまで待って、それが機能するかどうかを確認してください (これは試していませんが、良い方法のようです)。

start /wait a.exe
echo %ERRORLEVEL%
于 2009-02-26T19:56:10.287 に答える
2

機能するには%ERRORLEVEL%、コマンド拡張機能を有効にする必要があります(神がいつ知っているので、これがデフォルトだと思います)。

やってみてください:

echo %CMDEXTVERSION%

拡張機能が有効になっているかどうかを確認するには。2オンの場合は ' ' の出力が得られ%CMDEXTVERSION%、オフの場合は " " が出力されます。

古いスタイルを使用してエラーレベルをテストすることもできます:

if errorlevel 1 echo errorlevel is 1 or more...

これは、拡張子に関係なく、または誰かが " ERRORLEVEL"という名前の環境変数を設定した場合でも機能するはずです。

于 2009-02-26T19:59:44.647 に答える