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

101 case WM_CLOSE:
102  id = MessageBox(hWnd,"終了する?","",MB_YESNO);
103  if(id == IDYES)DestroyWindow(hWnd);
104 break;
105 case WM_DESTROY:
106  PostQuitMessage(0);
107 break;


103行目が実行されたら、WM_DESTROY が発生します。
そしたらそのまま104、105、106行目が順に実行されるんですか?
それとも、103が実行されたら104が実行される前に、
新しいプロセスで WM_DESTROY が入った WndProc( ) が
実行されて、それと同時に104が実行されて break で
ループが終了するんですか?

A 回答 (3件)

まず、プロセスというのは、この場合は関係なくて、



DestroyWindow を実行すると、内部で WndProc が呼び出されるのと同等な流れになると考えていいです。
DispatchMessage→WndProc(WM_CLOSE)→102→103→WndProc(WM_DESTROY)→106→107→return→104→return
とういうように、WM_CLOSE のメッセージを処理している途中で、WM_DESTROY が実行されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
プロセスとスレッドがよく分かってないんです。

103行目が実行されたら、そこで、プロセスかスレッドの
ような流れAが止まって、新しい流れBが WndProc(WM_DESTROY) で
動作して、Bによって101から104は読み込まれるけど
実行されず、105で case が当てはまって 106 が実行されて
107が読み込まれて、ソースには書いてないけど WndProc( ) の
最後の return 0 が実行されてBが終了し、Aの続きが再開されて、
104から順に読み込まれて、WndProc( ) の最後の return 0 が
実行されてAが終了する。

これで合っていますか?

お礼日時:2002/02/04 01:23

あまり複雑な事は考えないほうがいいと思います。


実際にはもっと複雑なんでしょうけど、WndProcを呼ぶ形としては
次の種類があると思います。

1.SendMessageのように戻りを取得するもの
2.PostMessageのようにメッセージキューに送信するだけのもの

1の場合には、inthefloiさんが言ってるように間接的にWndProc関数を呼び出す
ような感じになります。
もしWndProc内から行った場合には再起呼び出しと同じようになると思います。
実際には違いますがこう考えてはどうでしょう

100 LONG DestroyWindow(...)
101 {
102  return WndProc(WM_DESTROY,...)
103 }
104 
105 LRESULT CALLBACK WndProc(...)
106 {
107  switch( uMsg )
108  {
109  case WM_CLOSE:
110    DestroyWindow(hWnd);
111  break;
112  case WM_DESTROY:
113    PostQuitMessage(0);

そうすると
WndProc(110)
 DestroyWindow(102)
  WndProc(113)
 DestroyWindow(103)
WndProc(111)

みたいな感じになると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2002/02/05 22:50

>これで合っていますか?



なぜスレッドにこだわるのかがわかりません。
DestroyWindow の中でカレントスレッドを一時停止させて、新しいスレッドを作成して、WndProc を呼び出すのなら、カレントスレッドがそのまま WndProc を呼び出した方が無駄な事をしないぶんだけ有利です。

>Bによって101から104は読み込まれるけど実行されず

申し訳ないのですが、読み込まれるというのが何を意味しているのか私にはわかりません。switch-case を別の書き方をしてみると、

switch (m)
{
case WM_CLOSE:
 // 処理A
 break;
case WM_DESTROY:
 // 処理B
 break;
}



if (m == WM_CLOSE) {
 // 処理A
}
else if (m == WM_DESTROY) {
 // 処理B
}

となるわけだから、スレッドが作成されるかどうかに関係なく、実行されない部分は実行されません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
if に置きかえるやつを見て分かりました。

お礼日時:2002/02/05 22:50

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