プロが教える店舗&オフィスのセキュリティ対策術

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

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()
{
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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/24 13:09

function f()の中でWndProcの戻り値を0として制御を


戻してしまうことはWndProc内かWndProcを呼び出している
先を修正しない限り出来ません。
なのでfunction f()中のコードだけでは質問の内容
を実現することは無理です。

別個の関数(f)がその関数(WndProc)の戻り値装って勝手に
制御返せるってのは言語仕様としてまずいでしょうに。。。
    • good
    • 0
この回答へのお礼

無理なんですね。

お礼日時:2002/02/24 16:43

なんか、質問の意図がイマイチ読めないんですが…(え、じゃあ答えるなって?)



ぶっちゃけた話、その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を差し替えたいんでもない見たいだし…。
    • good
    • 0

回復不可能なエラーが発生した場合に、プログラムを強制終了させたいという意味でしょうか?


だとしたら、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';
}

こんな感じです。
何度も使う処理を別関数にさせているんだけど、
別関数の中で、特定の条件になればエラーでしたと表示して
別関数をストップさせ、元の関数もストップさせたいんです。
元の関数を止めるという部分のソースを知りたいです。

補足日時:2002/02/23 19:12
    • good
    • 0

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