読者です 読者をやめる 読者になる 読者になる

CWinApp::ExitInstance

CWinApp::ExitInstanceは、アプリケーションの終了処理を行うメンバ関数・・・。

CWinApp::ExitInstance

で、このメンバ関数はRun内部から呼ばれる・・・。
正常なら0、エラーなら0より大きい値を返す・・・。

今回は、InitInstanceでTRUEの時と、FALSEの時に、RunとExitInstanceがどういう順番で呼ばれるかを確認する・・・。

CWinApp_.hでは、

InitInstanceの戻り値と同じ値をもつm_bInitStateという変数を用意・・・。

InitInstance、Runとともに、ExitInstanceもオーバーライド・・・。

CWinApp_.cppのInitInstanceでは、

フレームウィンドウを作成、そして表示・・・。

メッセージボックスで"はい"、"いいえ"を選択・・・。
"はい"なら、m_bInitStateをTRUEにして、戻り値もTRUEでInitInstance終了・・・。
そうでないなら、それぞれFALSEにして終了・・・。

Runは、

基底クラスのメッセージループCWinApp::Runの前後にMessageBoxを配置させている・・・。
Runの前には"Run before"が表示されるし、Runの後には"Run after"が表示される・・・。

で、ExitInstanceでもメッセージボックスを表示させればいいのだが、これが一筋縄ではいかない・・・。
ウィンドウを閉じると、ここに来るのだが、音は鳴るのだがメッセージボックスが表示されない謎現象が発生する・・・。
表示されないメッセージボックスがある。(WindowsAPI,VC++) - Yahoo!知恵袋
どうも、WM_QUITの処理中はMessageBoxを呼んでもメッセージボックスが表示されない問題があるらしい・・・。
MessageBox in ExitInstance - CodeProject
これを参考に、

m_bInitStateがFALSEのとき、WM_QUITが処理されるまで待つような対策コードを追加した・・・。

これでExitInstanceに来た時もメッセージボックスを表示できるだろう・・・。

実行する・・・。

f:id:BG1:20150420124656p:plain

InitInstanceの"はい"、"いいえ"メッセージボックス・・・。
"はい"を選ぶと、

f:id:BG1:20150420124814p:plain

"Run before"が表示される・・・。
そのあとは、

f:id:BG1:20150420125122p:plain

後ろにいたウィンドウが閉じるまで表示されている・・・。
ウィンドウを閉じると、ウィンドウは消えて、

f:id:BG1:20150420125317p:plain

"ExitInstance"の表示・・・。

f:id:BG1:20150420125354p:plain

最後に"Run after"の表示で終了する・・・。
この順番から、ExitInstanceがRunの中で呼ばれていることが分かる・・・。

ちなみにInitInstanceで"いいえ"を押した場合、

f:id:BG1:20150420130908p:plain

ExitInstanceがすぐ呼ばれる仕組みになっている模様・・・。
(Runは呼ばれず、直接ExitInstanceを呼んでいるようだ・・・。)

Sample/CWinApp_.h at master · bg1bgst333/Sample · GitHub
Sample/CWinApp_.cpp at master · bg1bgst333/Sample · GitHub