-
Bug
-
Resolution: Unresolved
-
Not Evaluated
-
None
-
No Version
-
None
-
VS 2012
Qt 5.2 or 5.4
Windows 8.1 x64
32-bit project
1. Start with the "step4" example MFC project in QtWinMigrate.
2. Replace the optionsdialog.ui with the one attached.
3. Build against Qt5.2 or 5.4 (make sure you have a matching build of QtWinMigrate as well).
4. Run.
5. Edit -> Options...
6. Click the drop-down on the combo box. Click again to close it.
7. Close the Options dialog.
8. App will crash with stack overflow exception.
Through some debugging, I found that the likely culprit is a sort of re-entrance issue that happens during the destruction of the combo box. Below is a partial stack trace:
> Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2306 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::create(unsigned int window, bool initializeWindow, bool destroyOldWindow) Line 1272 C++
Qt5Widgetsd.dll!QWidgetPrivate::createWinId(unsigned int winid) Line 2309 C++
Qt5Widgetsd.dll!QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) Line 10226 C++
Qt5Widgetsd.dll!QWidgetPrivate::enforceNativeChildren() Line 573 C++
Qt5Widgetsd.dll!QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) Line 10223 C++
Qt5Widgetsd.dll!QWidget::winId() Line 2274 C++
QtSolutions_MFCMigrationFramework-headd.dll!QMfcApp::winEventFilter(tagMSG * msg, long * result) Line 417 C++
QtSolutions_MFCMigrationFramework-headd.dll!QMfcAppEventFilter::nativeEventFilter(const QByteArray & __formal, void * message, long * result) Line 79 C++
Qt5Cored.dll!QAbstractEventDispatcher::filterNativeEvent(const QByteArray & eventType, void * message, long * result) Line 466 C++
qwindowsd.dll!QWindowsContext::windowsProc(HWND__ * hwnd, unsigned int message, QtWindows::WindowsEventType et, unsigned int wParam, long lParam, long * result) Line 759 C++
qwindowsd.dll!qWindowsWndProc(HWND__ * hwnd, unsigned int message, unsigned int wParam, long lParam) Line 1073 C++
user32.dll!76b5791c() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]
user32.dll!76b57b7a() Unknown
user32.dll!76b57a7f() Unknown
kernel32.dll!74d5298e() Unknown
mfc110d.dll!AfxActivationWndProc(HWND_ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 513 C++
user32.dll!76b5791c() Unknown
user32.dll!76b57b7a() Unknown
user32.dll!76b57a7f() Unknown
user32.dll!76b57ccd() Unknown
user32.dll!76b813d1() Unknown
user32.dll!76b57e23() Unknown
ntdll.dll!76f0c692() Unknown
qwindowsd.dll!QWindowsWindow::destroyWindow() Line 981 C++
qwindowsd.dll!QWindowsWindow::~QWindowsWindow() Line 938 C++
qwindowsd.dll!QWindowsWindow::`scalar deleting destructor'(unsigned int) C++
Qt5Guid.dll!QWindow::destroy() Line 1500 C++
Qt5Widgetsd.dll!QWidgetPrivate::deleteTLSysExtra() Line 936 C++
Qt5Widgetsd.dll!QWidget::destroy(bool destroyWindow, bool destroySubWindows) Line 209 C++
Qt5Widgetsd.dll!QWidget::~QWidget() Line 1495 C++
Qt5Widgetsd.dll!QFrame::~QFrame() Line 219 C++
Qt5Widgetsd.dll!QComboBoxPrivateContainer::~QComboBoxPrivateContainer() C++
Qt5Widgetsd.dll!QComboBoxPrivateContainer::`scalar deleting destructor'(unsigned int) C++
Qt5Cored.dll!QObjectPrivate::deleteChildren() Line 1835 C++
Qt5Widgetsd.dll!QWidget::~QWidget() Line 1488 C++
Qt5Widgetsd.dll!QComboBox::~QComboBox() Line 1300 C++
During the destroy sequence, a message comes (0x0090, WM_UAHDESTROYWINDOW) and the QMfcApp::winEventFilter processes it. This causes QWidget::winId to be called on one of the widgets being destroyed, which triggers an infinite recursion loop in QWidget, resulting in a stack overflow.