単純な質問: それはどのようなメッセージですか? そして、それはどこから来たのですか?
症状:
アプリケーションを閉じているときにCWnd::WalkPreTranslateMessageでクラッシュが発生しました。これは 、メイン フレームが破棄され、その C++ オブジェクトが破棄された後、MFC が内部で WM_QUIT メッセージを処理する前に、CWinApp::PreTranslateMessageによって処理されるメッセージによって発生します。私は(Afx)PostQuitMessageを呼び出しません。
CWinApp::PreTranslateMessageをオーバーロードして、通過するメッセージをトレースしました。
これは、VS2005 (32 ビット) および VS2010 (64 ビット) で、デバッグおよびリリース モードで発生します。
タイムライン:
- CWinThread::m_pMainWndは NULL です (適切に破棄されています)
CWinApp::PreTranslateMessageが呼び出されます
パラメータMSG* メッセージは次のようになります。
hwnd: NULL message: varies from 49390 to 49401 wParam: 17 lParam: looks random
=> CWnd::WalkPreTranslateMessageでのクラッシュ
実行時に、その ID を持つメッセージがCWinApp::PreTranslateMessageを通過するのを確認します 。これらのメッセージがどこから来たのかを特定するのに役立つ興味深いメッセージの種類が 1 つあります。
MSG* メッセージは次のようになります。
hwnd: NULL
message: 49390
wParam: 17
lParam: looks random at first, though ...
lParam hiword: is incremented by 1 each time the message passes through
lParam loword: is constant
これらのメッセージは、hwnd が明示的に NULL であるスレッド メッセージのようです。それらが何に役立つのか、メッセージキューがいっぱいになるのを止める方法、または閉じるときにアプリケーションをクラッシュさせないように処理する方法については、まだ疑問に思っています。
まあ、今のところ、私はそれをこのように扱っていますが、これは正しくありません。
if (m_pMainWnd)
return CWinApp::PreTranslateMessage(pMsg);
else
return FALSE;
これらのメッセージを特定するのを手伝ってください、ありがとう!