• ベストアンサー

自作関数から 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 を実行させない }

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

  • ベストアンサー
noname#30727
noname#30727
回答No.3

ソースは手抜きっぽいですが、おそらくこんな感じです。 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; }

A__
質問者

お礼

try でできました。 WinProc( ) の catch( ) で return 0; を実行することになったけど 直接 WinProc( ) に return 0 を実行させる方法はないですか?

その他の回答 (3)

  • wr250zb
  • ベストアンサー率41% (7/17)
回答No.4

function f()の中でWndProcの戻り値を0として制御を 戻してしまうことはWndProc内かWndProcを呼び出している 先を修正しない限り出来ません。 なのでfunction f()中のコードだけでは質問の内容 を実現することは無理です。 別個の関数(f)がその関数(WndProc)の戻り値装って勝手に 制御返せるってのは言語仕様としてまずいでしょうに。。。

A__
質問者

お礼

無理なんですね。

回答No.2

なんか、質問の意図がイマイチ読めないんですが…(え、じゃあ答えるなって?) ぶっちゃけた話、その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を差し替えたいんでもない見たいだし…。

noname#30727
noname#30727
回答No.1

回復不可能なエラーが発生した場合に、プログラムを強制終了させたいという意味でしょうか? だとしたら、C++ の例外処理 try/catch/throw もしくは、C の setjmp/longjmp を使ってみてはどうでしょうか。

A__
質問者

補足

ありがとうございます。 でも、そうじゃなくて、 関数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'; } こんな感じです。 何度も使う処理を別関数にさせているんだけど、 別関数の中で、特定の条件になればエラーでしたと表示して 別関数をストップさせ、元の関数もストップさせたいんです。 元の関数を止めるという部分のソースを知りたいです。

関連するQ&A