在自定义控件中创建子按钮窗口后崩溃
Crash after creating child button window inside custom control
我有一个 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_PARENTNOTIFYwParam = 77594625, lParam = 3409408
我不知道这是什么原因,以及如何阻止它,我搜索了孩子,如果他们中的任何一个向父级发送任何消息,但没有消息,对话框没有显示,但它的窗口句柄已创建,自定义控件也有一个句柄,它的第一个孩子有一个句柄,然后我们陷入崩溃,其他孩子没有得到有机会被创造。我跟踪了执行,并在对话框中调用自定义控件的子项的创建方法后发生崩溃。自定义控件是一个数据库导航控件,其中包含用于下一个、上一个、新的、用于输入记录编号的按钮,此自定义控件继承自 CWnd。 它里面的按钮继承自 Button,而 Kubernetes 又继承自 CButton。
更新
问题如下:
当我注册自定义控件窗口类时,我将窗口程序设置为 MFC 窗口Proc ,当 MFC 进程找不到任何方法来吃消息时,它调用了窗口的默认进程,即导致打开递归的 MFC 窗口 Poc,我通过将窗口进程设置为默认进程来修复此问题,如下所示
WNDCLASS wndClass;
//fill the window class data
wndClass.lpfnWndProc = ::DefWindowProc;//AfxWndProc;//this fixed it
解决了我的问题
我更新了答案以包含该问题的解决方案,但为了响应@Michael Walz,我将解决方案添加到此答案中
当我注册自定义控件窗口类时,我将窗口程序设置为 MFC 窗口Proc ,当 MFC 进程找不到任何方法来吃消息时,它调用了窗口的默认进程,即导致打开递归的 MFC 窗口 Poc,我通过将窗口进程设置为默认进程来修复此问题,如下所示
WNDCLASS wndClass;
//fill the window class data
wndClass.lpfnWndProc = ::DefWindowProc;//AfxWndProc;//this fixed it
that fixed my problem
- Opencv在2013年第5季度不起作用.应用程序总是在窗口中崩溃
- 为什么抓取窗口标题的代码会导致应用崩溃?
- 如何在程序崩溃时关闭程序,没有任何警告屏幕等.C++窗口
- gdborig.exe 在调试 QT 5.8 并在窗口中打开 QFileDialog 时随机崩溃
- 尝试打开 SDL2 窗口时与 D-Bus 相关的运行时崩溃
- 使用第二个线程快速更新 GUI 窗口会通过调整窗口大小或移动窗口而崩溃
- OpenCV在我移动命名窗口时崩溃
- Gtkmm应用程序在调整窗口大小时在Windows 8.1上崩溃
- GDI 窗口中的游戏循环/一段时间后不刷新并崩溃
- MFC 程序崩溃时调整窗口大小并出现错误"A required resource was not found."
- 在自定义控件中创建子按钮窗口后崩溃
- WaitForMultipleObjects 在 64 位窗口上崩溃
- 关闭康科尔窗口会导致崩溃
- 在多个窗口中使用全局QNetworkCookieJar时,应用程序崩溃
- 打开窗口qt时应用程序崩溃
- SDL2在调整窗口大小时崩溃
- 通过firefox p11模块打开Wxwidget窗口时崩溃
- Emacs 24.3.1, Ubuntu 14.04.1 LTS, gdb在Emacs中的窗口切换都崩溃了
- SFML(C++)在创建窗口时崩溃?[SFML:1.6,CB:12.11]
- Qt 主窗口崩溃