• ベストアンサー

MFCアプリケーションでの終了コードの指定方法

以下の環境でプログラミングを実施しています。 開発環境:Visual Studio 2005 言語:Visual C++ プロジェクト:MFCアプリケーション OS:Windows XP Professional SP2 以下のようにコーディングを行い、任意の終了コードを指定しているつもりですが、 コマンドラインよりプログラム実行後、「echo %errorlevel%」を実行しても 0しか表示されずうまくいきません。 --------------------------------------------------------------------------- // 終了コード用グローバル変数 int g_nRetCode; BOOL CXXXXXApp::InitInstance() { ~~~省略~~~ CWinApp::InitInstance(); ~~~省略~~~ g_nRetCode = Main(); // メイン処理 ~~~省略~~~ return FALSE; } int CXXXXXApp::ExitInstance() { ~~~省略~~~ CWinApp::ExitInstance(); return g_nRetCode; } --------------------------------------------------------------------------- 上記開発環境で任意の終了コードを返すには、どのようにコーディングすれば よいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

すいません、映画観に行ってました。 結局、原因は(コーディングではなく)、コマンドラインからウィンドウアプリケーションを起動する場合、終了待ちしないということにあります。 start /wait exitCode.exe の様に終了待ちして起動すれば echo %errorlevel% で返値が取れるはず。

mkmarimo
質問者

お礼

ご回答ありがとうございます。 なるほど!終了待ちですか。 確かに実行後まだ処理が継続しているのにコマンドライン上では プロンプトが次の入力を待っていました。 終了待ちをするにはアプリ実行時に上記のように start /wait exitCode.exe とするしかないのでしょうか? Visual C++で処理がすべて終了するまで終了コードを 返さないように簡単にコーディングする方法は ありませんでしょうか? お礼の中での質問になってしまい申し訳ありません。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

MFCで試したことはないのですが... コンソールアプリとしてビルドすれば、期待通りのことができるかもしれません。 具体的には次のようにします。 1. main関数を作成し、main関数からWinMain関数を呼び出す。 2. オプションを修正し、コンソールアプリケーションとしてビルドする。 うまくいけば、コンソールアプリケーションですので、プログラムの終了まで待ってくれるはずです。 また、副次的な効果として、std::coutやstd::cinなどの標準入出力も使えるようになります。

mkmarimo
質問者

お礼

ご回答ありがとうございます。 そんなテクがあったんですね。 けど、プログラム実行後にDOS窓が起動しちゃいませんでしょうか? そうなると少し困ります・・・。 やはり呼び出すときに考慮するようにします。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>Visual C++で処理がすべて終了するまで終了コードを返さないように簡単にコーディングする方法はありませんでしょうか? 既に述べましたように、コーディングの問題ではなくて、起動する側の問題ですので、コーディングで解決はできません。 起動するプログラムを終了待ちするように起動する必要があります。

mkmarimo
質問者

お礼

たびたびありがとうございます。 呼び出す時に考慮するようにします。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

終了コードを返すコーディングは、質問者のコードで良いように思います。 ウチでも試してみましたが、この時のコードは、0になっているのではなくてERRORLEVEL にはセットされないようです。 (他のコマンドでERRORLEVELが変更された後、実行しても変化しないので) しかし、 Dim oShell, ret Set oShell = WScript.CreateObject ("WSCript.shell") ret=oShell.run("exitCode.exe",5, true) WScript.Echo ret Set oShell = Nothing のようなVBScript を試してみると、プログラムで設定したリターンコードが表示されるので、ちゃんと終了コード自体は返されているのが確認できます。

関連するQ&A

専門家に質問してみよう