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に来た時もメッセージボックスを表示できるだろう・・・。
実行する・・・。
InitInstanceの"はい"、"いいえ"メッセージボックス・・・。
"はい"を選ぶと、
"Run before"が表示される・・・。
そのあとは、
後ろにいたウィンドウが閉じるまで表示されている・・・。
ウィンドウを閉じると、ウィンドウは消えて、
"ExitInstance"の表示・・・。
最後に"Run after"の表示で終了する・・・。
この順番から、ExitInstanceがRunの中で呼ばれていることが分かる・・・。
ちなみにInitInstanceで"いいえ"を押した場合、
ExitInstanceがすぐ呼ばれる仕組みになっている模様・・・。
(Runは呼ばれず、直接ExitInstanceを呼んでいるようだ・・・。)
Sample/CWinApp_.h at master · bg1bgst333/Sample · GitHub
Sample/CWinApp_.cpp at master · bg1bgst333/Sample · GitHub