- ベストアンサー
自作関数から WndProc( ) を止める
自作関数から WndProc( ) を止めるにはどうしたらいいんですか? LRESULT CALLBACK WndProc(…){ switch(msg){ case WM_COMMAND: if(function f( ) == "END")return 0; 処理A; break; } } function f( ){ return "END" } こんな流れにしたいけど、WndProc( ) 内からでなく、 外から WndProc( ) を止めたいんです。 LRESULT CALLBACK WndProc(…){ switch(msg){ case WM_COMMAND: function f( ); 処理A; break; } } function f( ){ ? // WndProc( ) に return 0 とさせて 処理A を実行させない }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ソースは手抜きっぽいですが、おそらくこんな感じです。 main 関数の中の try {} の中を実行中に、誰かが throw をしたら、関数呼び出しのネストを無かった事にして、throw したオブジェクトのクラスに対応した catch に飛びます。new や、malloc したものは戻りませんが、デストラクタは実行されます。 ここでは、Exception というクラスを作成していますが、例外の種類ごとに適当なクラスを作成する事もあるし、エラーコードのようなものを int で throw する事もできます。 ※try/catch/throw の一般的な使い方と注意点に関しては、別途何かを参照してください。 ----------------------------- #include <iostream.h> class Exception { }; void test0(int y) { if (y == 0) throw Exception(); } int divide(int x, int y) { test0(y); return x / y; } int main() { int x, y; cout << "x を入力してください" << endl; cin >> x; cout << "y を入力してください" << endl; cin >> y; try { cout << "x / y = " << divide(x, y) << endl; } catch (Exception E) { cout << "y が 0 でした" << endl; } return 0; }
その他の回答 (3)
- wr250zb
- ベストアンサー率41% (7/17)
function f()の中でWndProcの戻り値を0として制御を 戻してしまうことはWndProc内かWndProcを呼び出している 先を修正しない限り出来ません。 なのでfunction f()中のコードだけでは質問の内容 を実現することは無理です。 別個の関数(f)がその関数(WndProc)の戻り値装って勝手に 制御返せるってのは言語仕様としてまずいでしょうに。。。
お礼
無理なんですね。
- fatal_error
- ベストアンサー率39% (23/58)
なんか、質問の意図がイマイチ読めないんですが…(え、じゃあ答えるなって?) ぶっちゃけた話、そのfunctionの戻り値で、 ifかけちゃえばいいんでは? LRESULT CALLBACK WndProc(…){ switch(msg){ case WM_COMMAND: if(function f( )){ 処理A; } break; } } BOOL function f( ){ ? // WndProc( ) に return 0 とさせて 処理A を実行させない if(hoge) return FALSE; else return TRUE; } こんな感じで… そんな毎回ifしてたんじゃ実行速度が!ってほどcriticalな場合は別でしょうけど。 純粋にwindow procedureを差し替えたいんでもない見たいだし…。
回復不可能なエラーが発生した場合に、プログラムを強制終了させたいという意味でしょうか? だとしたら、C++ の例外処理 try/catch/throw もしくは、C の setjmp/longjmp を使ってみてはどうでしょうか。
補足
ありがとうございます。 でも、そうじゃなくて、 関数B から 関数A に return 0 を実行させる方法が 知りたいんです。 #include <iostream.h> int f(x); main(){ for(int i=0; i<5; i++){ f(i); } cout << 111; for(int i=5; i<9; i++){ f(i); } cout << 222; } int f(x){ if(x==3)main()をreturnさせる; cout << x << '\n'; } こんな感じです。 何度も使う処理を別関数にさせているんだけど、 別関数の中で、特定の条件になればエラーでしたと表示して 別関数をストップさせ、元の関数もストップさせたいんです。 元の関数を止めるという部分のソースを知りたいです。
お礼
try でできました。 WinProc( ) の catch( ) で return 0; を実行することになったけど 直接 WinProc( ) に return 0 を実行させる方法はないですか?