0

カスタムコントロールを含む単純なダイアログを表示するMFCアプリケーションがあり、カスタム作成の動的コントロールウィンドウがあります。カスタム コントロールの最初の子が作成された後、スタック オーバーフロー後にアプリケーションがクラッシュする

これはクラッシュ後のコールスタックです

    Amn80Lib1.dll!TPXBitButton::GetThisMessageMap() Line 1627   C++
    Amn80Lib1.dll!TPXBitButton::GetMessageMap() Line 1627   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2181    C++
    mfc100d.dll!CWnd::ReflectChildNotify(unsigned int uMsg, unsigned int wParam, long lParam, long * pResult) Line 3408 C++
>   mfc100d.dll!CWnd::OnChildNotify(unsigned int uMsg, unsigned int wParam, long lParam, long * pResult) Line 3387  C++
    mfc100d.dll!CButton::OnChildNotify(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 91  C++
    mfc100d.dll!CWnd::SendChildNotifyLastMsg(long * pResult) Line 3327  C++
    mfc100d.dll!CWnd::ReflectLastMsg(HWND__ * hWndChild, long * pResult) Line 3365  C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3463   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    [Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]    
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    user32.dll!75d1c4e7()   Unknown
    user32.dll!75d1c5e7()   Unknown
    user32.dll!75d1c590()   Unknown
    user32.dll!75d11b31()   Unknown
    user32.dll!75d32bee()   Unknown
    mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1089 C++
    mfc100d.dll!CWnd::Default() Line 291    C++
    mfc100d.dll!CWnd::OnParentNotify(unsigned int message, long lParam) Line 3468   C++
    mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2435    C++
    mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2087  C++
    Amn80Lib1.dll!TControl::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 29  C++
    mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 257    C++
    mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 C++
    The maximum number of stack frames supported by Visual Studio has been exceeded.    

常に送信されるメッセージは 528 です。これは 0x210 = WM_PARENTNOTIFY です。 wParam = 77594625、lParam = 3409408

その理由と、それを停止する方法がわかりません。子のいずれかが親にメッセージを送信するかどうかを検索しましたが、メッセージはなく、ダイアログは表示されませんが、ウィンドウハンドルは作成され、カスタム コントロールにもハンドルがあり、最初の子にハンドルがあると、クラッシュが発生し、他の子を作成する機会がありませんでした。実行を追跡したところ、ダイアログ内のカスタム コントロールの子の create メソッドを呼び出した後にクラッシュが発生したことがわかりました。カスタム コントロールは、レコード番号を入力するための次、前、新規、編集用のボタンを含むデータベース ナビゲーション コントロールです。このカスタム コントロールは、CWnd から継承された TControl から継承されます。その中のボタンは、CButton を継承する TButton を継承しています。

アップデート


問題は次のとおりでした。

カスタム コントロール ウィンドウ クラスを登録したとき、windowproc を MFC windowProc に設定しました。MFC proc がメッセージを処理するメソッドを見つけられなかったときは、ウィンドウのデフォルト proc を呼び出しました。これは、開いている再帰を引き起こした MFC windowPoc です。次のようにウィンドウプロシージャをデフォルトのものに設定することで修正しました

WNDCLASS wndClass;
//fill the window class data
wndClass.lpfnWndProc = ::DefWindowProc;//AfxWndProc;//this fixed it

それは私の問題を解決しました

4

1 に答える 1

0

その問題の解決策を含むように回答を更新しましたが、@Michael Walz に応じて、この回答に解決策を追加しました


カスタム コントロール ウィンドウ クラスを登録したとき、windowproc を MFC windowProc に設定しました。MFC proc がメッセージを処理するメソッドを見つけられなかったときは、ウィンドウのデフォルト proc を呼び出しました。これは、開いている再帰を引き起こした MFC windowPoc です。次のようにウィンドウプロシージャをデフォルトのものに設定することで修正しました

WNDCLASS wndClass;
//fill the window class data
wndClass.lpfnWndProc = ::DefWindowProc;//AfxWndProc;//this fixed it
that fixed my problem
于 2013-11-04T16:44:15.873 に答える