summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-11-09 19:18:19 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-11-09 19:18:19 +0300
commit96b0cd72b2d788134890e6baaedae9fb45bdc9ba (patch)
tree510934c265d332bc0f3ead17651747735471a73e
parent0527df4340793eda696b0cd7594e22b6be9a989e (diff)
fixes #3816 (Random crash)
-rw-r--r--include/m_gui.h2
-rw-r--r--plugins/PluginUpdater/src/DlgListNew.cpp2
-rw-r--r--src/mir_core/src/Windows/CCtrlBase.cpp42
-rw-r--r--src/mir_core/src/mir_core.def1
-rw-r--r--src/mir_core/src/mir_core64.def1
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