From 8c994925181e46e9f8d0c15db240cff3fb45d77f Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 18 Feb 2026 22:10:14 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E8=81=94=E5=8A=A8=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/ROTPPTManager.cs | 59 ++++++++++++++++++----------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/Ink Canvas/Helpers/ROTPPTManager.cs b/Ink Canvas/Helpers/ROTPPTManager.cs index 224e62fa..e35f9c60 100644 --- a/Ink Canvas/Helpers/ROTPPTManager.cs +++ b/Ink Canvas/Helpers/ROTPPTManager.cs @@ -249,18 +249,18 @@ namespace Ink_Canvas.Helpers { if (_disposed || _isModuleUnloading) return; - if (_pptApplication != null && !IsConnected) - { - DisconnectFromPPT(); - return; - } - lock (_lockObject) { try { if (_isModuleUnloading) return; + if (_pptApplication != null && !IsConnected) + { + DisconnectFromPPT(); + return; + } + // 使用 ROT 获取当前最佳 PPT 实例 var bestApp = PPTROTConnectionHelper.TryConnectViaROT(IsSupportWPS); @@ -373,25 +373,31 @@ namespace Ink_Canvas.Helpers private void DisconnectFromPPT() { + object appToRelease = null; try { - _isModuleUnloading = true; - _unifiedRotTimer?.Stop(); - PPTConnectionChanged?.Invoke(false); LogHelper.WriteLogToFile("[ROT] 准备断开 PPT 连接,先卸载监控模块", LogHelper.LogType.Event); - if (_pptApplication != null) + lock (_lockObject) + { + _isModuleUnloading = true; + _unifiedRotTimer?.Stop(); + appToRelease = _pptApplication; + _pptApplication = null; + } + + if (appToRelease != null) { try { - if (Marshal.IsComObject(_pptApplication)) + if (Marshal.IsComObject(appToRelease)) { Application.Current?.Dispatcher?.Invoke(() => { try { - var app = _pptApplication as Microsoft.Office.Interop.PowerPoint.Application; + var app = appToRelease as Microsoft.Office.Interop.PowerPoint.Application; if (app != null) { app.PresentationOpen -= OnPresentationOpenInternal; @@ -413,20 +419,20 @@ namespace Ink_Canvas.Helpers LogHelper.WriteLogToFile($"[ROT] 取消 PPT 事件注册失败: {ex}", LogHelper.LogType.Warning); } - if (Marshal.IsComObject(_pptApplication)) + if (Marshal.IsComObject(appToRelease)) { try { - Marshal.FinalReleaseComObject(_pptApplication); + Marshal.FinalReleaseComObject(appToRelease); } catch { try { - int refCount = Marshal.ReleaseComObject(_pptApplication); + int refCount = Marshal.ReleaseComObject(appToRelease); while (refCount > 0) { - refCount = Marshal.ReleaseComObject(_pptApplication); + refCount = Marshal.ReleaseComObject(appToRelease); } } catch { } @@ -434,8 +440,6 @@ namespace Ink_Canvas.Helpers } } - _pptApplication = null; - GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); @@ -454,21 +458,30 @@ namespace Ink_Canvas.Helpers System.Threading.Thread.Sleep(200); - _isModuleUnloading = false; - if (!_disposed) - _unifiedRotTimer?.Start(); + lock (_lockObject) + { + _isModuleUnloading = false; + if (!_disposed) + _unifiedRotTimer?.Start(); + } } catch (Exception ex) { LogHelper.WriteLogToFile($"[ROT] 重新进入监控状态失败: {ex}", LogHelper.LogType.Error); - _isModuleUnloading = false; + lock (_lockObject) + { + _isModuleUnloading = false; + } } }); } catch (Exception ex) { LogHelper.WriteLogToFile($"[ROT] 断开 PPT 连接失败: {ex}", LogHelper.LogType.Error); - _isModuleUnloading = false; + lock (_lockObject) + { + _isModuleUnloading = false; + } } } #endregion