回答編集履歴

2

修正例の単純化

2016/10/19 06:35

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -30,9 +30,7 @@
30
30
 
31
31
  DispatchMessage( &msg );
32
32
 
33
- if( ret == 0 ) break;
34
-
35
- if( ret == WM_DESTROY ) break;
33
+ if( ret == WM_DESTROY ) break; /* WM_QUITではない */
36
34
 
37
35
  }
38
36
 

1

加筆修正

2016/10/19 06:35

投稿

majiponi
majiponi

スコア1720

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