OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

自作関数から WndProc( ) を止める

  • 暇なときにでも
  • 質問No.223087
  • 閲覧数538
  • ありがとう数3
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 59% (194/328)

自作関数から 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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答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()
{
intx, 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__

お礼率 59% (194/328)

try でできました。
WinProc( ) の catch( ) で return 0; を実行することになったけど
直接 WinProc( ) に return 0 を実行させる方法はないですか?
投稿日時 - 2002-02-24 13:09:10
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1

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

お礼率 59% (194/328)

ありがとうございます。
でも、そうじゃなくて、
関数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';
}

こんな感じです。
何度も使う処理を別関数にさせているんだけど、
別関数の中で、特定の条件になればエラーでしたと表示して
別関数をストップさせ、元の関数もストップさせたいんです。
元の関数を止めるという部分のソースを知りたいです。
投稿日時 - 2002-02-23 19:12:21
  • 回答No.2
レベル8

ベストアンサー率 39% (23/58)

なんか、質問の意図がイマイチ読めないんですが…(え、じゃあ答えるなって?) ぶっちゃけた話、そのfunctionの戻り値で、 ifかけちゃえばいいんでは? LRESULT CALLBACK WndProc(…){  switch(msg){  case WM_COMMAND:   if(function f( )){     処理A;   }  break;  } ...続きを読む
なんか、質問の意図がイマイチ読めないんですが…(え、じゃあ答えるなって?)

ぶっちゃけた話、その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を差し替えたいんでもない見たいだし…。
  • 回答No.4
レベル7

ベストアンサー率 41% (7/17)

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

別個の関数(f)がその関数(WndProc)の戻り値装って勝手に
制御返せるってのは言語仕様としてまずいでしょうに。。。
お礼コメント
A__

お礼率 59% (194/328)

無理なんですね。
投稿日時 - 2002-02-24 16:43:54
このQ&Aのテーマ
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ