0

単純な質問: それはどのようなメッセージですか? そして、それはどこから来たのですか?

症状:

アプリケーションを閉じているときにCWnd::WalkPreTranslateMessageでクラッシュが発生しました。これは 、メイン フレームが破棄され、その C++ オブジェクトが破棄された後、MFC が内部で WM_QUIT メッセージを処理する前に、CWinApp::PreTranslateMessageによって処理されるメッセージによって発生します。私は(Afx)PostQuitMessageを呼び出しません。

CWinApp::PreTranslateMessageをオーバーロードして、通過するメッセージをトレースしました。

これは、VS2005 (32 ビット) および VS2010 (64 ビット) で、デバッグおよびリリース モードで発生します。

タイムライン:

  1. CWinThread::m_pMainWndは NULL です (適切に破棄されています)
  2. 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;

これらのメッセージを特定するのを手伝ってください、ありがとう!

4

1 に答える 1

0

その範囲 (0xC000 を超えるもの) のメッセージが から返されRegisterWindowMessageます。この種のことは起こらないはずであり、適切に作成された MFC アプリケーションでは起こらないため、何か間違ったことをしているのではないかと思います。

于 2013-01-23T01:19:28.013 に答える