From 96b0cd72b2d788134890e6baaedae9fb45bdc9ba Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 9 Nov 2023 19:18:19 +0300 Subject: fixes #3816 (Random crash) --- include/m_gui.h | 2 +- plugins/PluginUpdater/src/DlgListNew.cpp | 2 +- src/mir_core/src/Windows/CCtrlBase.cpp | 42 ++++++++++++-------------------- src/mir_core/src/mir_core.def | 1 - src/mir_core/src/mir_core64.def | 1 - 5 files changed, 17 insertions(+), 31 deletions(-) diff --git a/include/m_gui.h b/include/m_gui.h index 5d96a1fa8a..ff6c40d43d 100644 --- a/include/m_gui.h +++ b/include/m_gui.h @@ -409,10 +409,10 @@ protected: virtual LRESULT CustomWndProc(UINT msg, WPARAM wParam, LPARAM lParam); void Subclass(); - void Unsubclass(); private: static LRESULT CALLBACK GlobalSubclassWndProc(MWindow hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + WNDPROC oldProc; }; ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/PluginUpdater/src/DlgListNew.cpp b/plugins/PluginUpdater/src/DlgListNew.cpp index 82411128bc..4b8a0d6ec6 100644 --- a/plugins/PluginUpdater/src/DlgListNew.cpp +++ b/plugins/PluginUpdater/src/DlgListNew.cpp @@ -192,7 +192,7 @@ public: Utils_SaveWindowPosition(m_hwnd, NULL, MODULENAME, "ListWindow"); Window_FreeIcon_IcoLib(m_hwnd); hwndDialog = nullptr; - delete (OBJLIST *)GetWindowLongPtr(m_hwnd, GWLP_USERDATA); + delete todo; } int Resizer(UTILRESIZECONTROL *urc) override diff --git a/src/mir_core/src/Windows/CCtrlBase.cpp b/src/mir_core/src/Windows/CCtrlBase.cpp index 164a34e09b..6150dcbbb0 100644 --- a/src/mir_core/src/Windows/CCtrlBase.cpp +++ b/src/mir_core/src/Windows/CCtrlBase.cpp @@ -24,18 +24,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static mir_cs csCtrl; -static int CompareControls(const CCtrlBase *p1, const CCtrlBase *p2) -{ - return (INT_PTR)p1->GetHwnd() - (INT_PTR)p2->GetHwnd(); -} -static LIST arControls(10, CompareControls); - ///////////////////////////////////////////////////////////////////////////////////////// // CCtrlBase CCtrlBase::CCtrlBase(CDlgBase *wnd, int idCtrl) : m_parentWnd(wnd), - m_idCtrl(idCtrl) + m_idCtrl(idCtrl), + oldProc(nullptr) { if (wnd) wnd->AddControl(this); @@ -52,12 +47,9 @@ void CCtrlBase::OnInit() void CCtrlBase::OnDestroy() { - int idx = arControls.indexOf(this); - if (idx != -1) { - Unsubclass(); - - mir_cslock lck(csCtrl); - arControls.remove(idx); + if (oldProc) { + SetWindowLongPtrW(m_hwnd, GWLP_USERDATA, 0); + SetWindowLongPtrW(m_hwnd, GWLP_WNDPROC, (LONG_PTR)oldProc); } m_hwnd = nullptr; @@ -196,29 +188,25 @@ LRESULT CCtrlBase::CustomWndProc(UINT, WPARAM, LPARAM) return FALSE; } +///////////////////////////////////////////////////////////////////////////////////////// + LRESULT CALLBACK CCtrlBase::GlobalSubclassWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - PVOID bullshit[2]; // vfptr + hwnd - bullshit[1] = hwnd; - CCtrlBase *pCtrl = arControls.find((CCtrlBase*)&bullshit); - if (pCtrl) { + if (auto *pCtrl = (CCtrlBase *)GetWindowLongPtrW(hwnd, GWLP_USERDATA)) { LRESULT res = pCtrl->CustomWndProc(msg, wParam, lParam); - if (res != 0) + if (res) return res; + + return pCtrl->oldProc(hwnd, msg, wParam, lParam); } - return mir_callNextSubclass(hwnd, GlobalSubclassWndProc, msg, wParam, lParam); + return FALSE; } void CCtrlBase::Subclass() { - mir_subclassWindow(m_hwnd, GlobalSubclassWndProc); + SetWindowLongPtrW(m_hwnd, GWLP_USERDATA, LPARAM(this)); - mir_cslock lck(csCtrl); - arControls.insert(this); -} - -void CCtrlBase::Unsubclass() -{ - mir_unsubclassWindow(m_hwnd, GlobalSubclassWndProc); + oldProc = (WNDPROC)GetWindowLongPtrW(m_hwnd, GWLP_WNDPROC); + SetWindowLongPtrW(m_hwnd, GWLP_WNDPROC, (LONG_PTR)&GlobalSubclassWndProc); } diff --git a/src/mir_core/src/mir_core.def b/src/mir_core/src/mir_core.def index 3b80e61e94..062c0d01f0 100644 --- a/src/mir_core/src/mir_core.def +++ b/src/mir_core/src/mir_core.def @@ -864,7 +864,6 @@ mir_wstrcmpi @280 ?ThemeDialogBackground@CDlgBase@@IAEXH@Z @1061 NONAME ?TranslateItem@CCtrlTreeView@@QAEXPAU_TREEITEM@@@Z @1062 NONAME ?TranslateTree@CCtrlTreeView@@QAEXXZ @1063 NONAME -?Unsubclass@CCtrlBase@@IAEXXZ @1064 NONAME ?Update@CCtrlListView@@QAEHH@Z @1065 NONAME ?GetInst@CDlgBase@@QBEPAUHINSTANCE__@@XZ @1075 NONAME ?Find@CDlgBase@@SAPAV1@PAUHWND__@@@Z @1076 NONAME diff --git a/src/mir_core/src/mir_core64.def b/src/mir_core/src/mir_core64.def index 837f49d092..7e99275966 100644 --- a/src/mir_core/src/mir_core64.def +++ b/src/mir_core/src/mir_core64.def @@ -864,7 +864,6 @@ mir_wstrcmpi @280 ?ThemeDialogBackground@CDlgBase@@IEAAXH@Z @1061 NONAME ?TranslateItem@CCtrlTreeView@@QEAAXPEAU_TREEITEM@@@Z @1062 NONAME ?TranslateTree@CCtrlTreeView@@QEAAXXZ @1063 NONAME -?Unsubclass@CCtrlBase@@IEAAXXZ @1064 NONAME ?Update@CCtrlListView@@QEAAHH@Z @1065 NONAME ?GetInst@CDlgBase@@QEBAPEAUHINSTANCE__@@XZ @1075 NONAME ?Find@CDlgBase@@SAPEAV1@PEAUHWND__@@@Z @1076 NONAME -- cgit v1.2.3