teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正例の単純化

2016/10/19 06:35

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -14,7 +14,6 @@
14
14
  ret = GetMessage( &msg, NULL, 0, 0 );
15
15
  if( ret == -1 ) break;
16
16
  DispatchMessage( &msg );
17
- if( ret == 0 ) break;
18
- if( ret == WM_DESTROY ) break;
17
+ if( ret == WM_DESTROY ) break; /* WM_QUITではない */
19
18
  }
20
19
  ```

1

加筆修正

2016/10/19 06:35

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -1,12 +1,20 @@
1
- 疑問にすべて答えることはできませんが、断片的なヒントだけでもと。
2
-
3
- 再度のコンパイルできなかった理由ですが、「文字通り」プログラムが終了していなかったからです。その理由は、プログラムがDLL側で無限ループに入ってしまったことです。
1
+ プロセス終了しなかった理由ですが、「文字通り」プログラムが終了していなかったからです。
4
2
  ShowColorWindow関数をご覧ください。
5
3
  ```C
6
4
  while( true ){
7
5
  GetMessage( &msg, NULL, 0, 0 );
8
6
  DispatchMessage( &msg );
9
7
  }
10
- ```このループは、どのようなときに抜け出しますか?
8
+ ```どのようなときにこのループは終了しますか?
11
- というのが答えです。ウインドウが破棄されても抜け出すことはありません
9
+ というのが答えです。ウインドウが破棄されてもここからられず、return文に到達しなかったため、プログラムが終了しなかったのです。
12
- なので、メッセージIDをチェックして、WM_DESTROYだったり、そもそもGetMessage関数がエラーを出しているときにループを抜ける処理を追加してあげるといいと思います。
10
+ なので、メッセージIDをチェックしてループを抜ける処理を追加ると正しく動作するようになります。
11
+ ```C
12
+ int ret;
13
+ while( true ){
14
+ ret = GetMessage( &msg, NULL, 0, 0 );
15
+ if( ret == -1 ) break;
16
+ DispatchMessage( &msg );
17
+ if( ret == 0 ) break;
18
+ if( ret == WM_DESTROY ) break;
19
+ }
20
+ ```