みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}

---------------------------------------------------------------------------

上記開発環境で任意の終了コードを返すには、どのようにコーディングすれば
よいのでしょうか?

投稿日時 - 2006-07-29 18:12:40

QNo.2307164

すぐに回答ほしいです

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

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

投稿日時 - 2006-07-30 00:45:22

お礼

ご回答ありがとうございます。

なるほど!終了待ちですか。
確かに実行後まだ処理が継続しているのにコマンドライン上では
プロンプトが次の入力を待っていました。

終了待ちをするにはアプリ実行時に上記のように
start /wait exitCode.exe
とするしかないのでしょうか?

Visual C++で処理がすべて終了するまで終了コードを
返さないように簡単にコーディングする方法は
ありませんでしょうか?

お礼の中での質問になってしまい申し訳ありません。

投稿日時 - 2006-07-30 10:40:42

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

MFCで試したことはないのですが...

コンソールアプリとしてビルドすれば、期待通りのことができるかもしれません。
具体的には次のようにします。

1. main関数を作成し、main関数からWinMain関数を呼び出す。
2. オプションを修正し、コンソールアプリケーションとしてビルドする。

うまくいけば、コンソールアプリケーションですので、プログラムの終了まで待ってくれるはずです。
また、副次的な効果として、std::coutやstd::cinなどの標準入出力も使えるようになります。

投稿日時 - 2006-07-30 13:36:39

お礼

ご回答ありがとうございます。

そんなテクがあったんですね。
けど、プログラム実行後にDOS窓が起動しちゃいませんでしょうか?

そうなると少し困ります・・・。

やはり呼び出すときに考慮するようにします。

ありがとうございました。

投稿日時 - 2006-07-30 17:57:17

ANo.3

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

投稿日時 - 2006-07-30 11:25:36

お礼

たびたびありがとうございます。

呼び出す時に考慮するようにします。

ありがとうございました。

投稿日時 - 2006-07-30 17:55:37

ANo.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 を試してみると、プログラムで設定したリターンコードが表示されるので、ちゃんと終了コード自体は返されているのが確認できます。

投稿日時 - 2006-07-29 19:25:05

あなたにオススメの質問