プロが教えるわが家の防犯対策術!

以下の環境でプログラミングを実施しています。

開発環境: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;
}

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

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

A 回答 (4件)

すいません、映画観に行ってました。


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

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

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

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

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

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

お礼日時:2006/07/30 10:40

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



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

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

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

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

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

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

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

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

お礼日時:2006/07/30 17:57

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


既に述べましたように、コーディングの問題ではなくて、起動する側の問題ですので、コーディングで解決はできません。
起動するプログラムを終了待ちするように起動する必要があります。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2006/07/30 17:55

終了コードを返すコーディングは、質問者のコードで良いように思います。


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています