diff options
author | George Hazan <george.hazan@gmail.com> | 2023-11-09 19:18:19 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2023-11-09 19:18:19 +0300 |
commit | 96b0cd72b2d788134890e6baaedae9fb45bdc9ba (patch) | |
tree | 510934c265d332bc0f3ead17651747735471a73e | |
parent | 0527df4340793eda696b0cd7594e22b6be9a989e (diff) |
fixes #3816 (Random crash)
-rw-r--r-- | include/m_gui.h | 2 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/DlgListNew.cpp | 2 | ||||
-rw-r--r-- | src/mir_core/src/Windows/CCtrlBase.cpp | 42 | ||||
-rw-r--r-- | src/mir_core/src/mir_core.def | 1 | ||||
-rw-r--r-- | 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<FILEINFO> *)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<CCtrlBase> 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
|