improve:联动模块

This commit is contained in:
2026-02-18 22:10:14 +08:00
parent b5b2d97786
commit 8c99492518
+31 -18
View File
@@ -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,23 +458,32 @@ namespace Ink_Canvas.Helpers
System.Threading.Thread.Sleep(200);
lock (_lockObject)
{
_isModuleUnloading = false;
if (!_disposed)
_unifiedRotTimer?.Start();
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"[ROT] 重新进入监控状态失败: {ex}", LogHelper.LogType.Error);
lock (_lockObject)
{
_isModuleUnloading = false;
}
}
});
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"[ROT] 断开 PPT 连接失败: {ex}", LogHelper.LogType.Error);
lock (_lockObject)
{
_isModuleUnloading = false;
}
}
}
#endregion
#region PPT Event Handlers (internal, strong-typed)