improve:联动模块
This commit is contained in:
@@ -249,18 +249,18 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
if (_disposed || _isModuleUnloading) return;
|
if (_disposed || _isModuleUnloading) return;
|
||||||
|
|
||||||
if (_pptApplication != null && !IsConnected)
|
|
||||||
{
|
|
||||||
DisconnectFromPPT();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
lock (_lockObject)
|
lock (_lockObject)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_isModuleUnloading) return;
|
if (_isModuleUnloading) return;
|
||||||
|
|
||||||
|
if (_pptApplication != null && !IsConnected)
|
||||||
|
{
|
||||||
|
DisconnectFromPPT();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 使用 ROT 获取当前最佳 PPT 实例
|
// 使用 ROT 获取当前最佳 PPT 实例
|
||||||
var bestApp = PPTROTConnectionHelper.TryConnectViaROT(IsSupportWPS);
|
var bestApp = PPTROTConnectionHelper.TryConnectViaROT(IsSupportWPS);
|
||||||
|
|
||||||
@@ -373,25 +373,31 @@ namespace Ink_Canvas.Helpers
|
|||||||
|
|
||||||
private void DisconnectFromPPT()
|
private void DisconnectFromPPT()
|
||||||
{
|
{
|
||||||
|
object appToRelease = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_isModuleUnloading = true;
|
|
||||||
_unifiedRotTimer?.Stop();
|
|
||||||
|
|
||||||
PPTConnectionChanged?.Invoke(false);
|
PPTConnectionChanged?.Invoke(false);
|
||||||
LogHelper.WriteLogToFile("[ROT] 准备断开 PPT 连接,先卸载监控模块", LogHelper.LogType.Event);
|
LogHelper.WriteLogToFile("[ROT] 准备断开 PPT 连接,先卸载监控模块", LogHelper.LogType.Event);
|
||||||
|
|
||||||
if (_pptApplication != null)
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
_isModuleUnloading = true;
|
||||||
|
_unifiedRotTimer?.Stop();
|
||||||
|
appToRelease = _pptApplication;
|
||||||
|
_pptApplication = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (appToRelease != null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (Marshal.IsComObject(_pptApplication))
|
if (Marshal.IsComObject(appToRelease))
|
||||||
{
|
{
|
||||||
Application.Current?.Dispatcher?.Invoke(() =>
|
Application.Current?.Dispatcher?.Invoke(() =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var app = _pptApplication as Microsoft.Office.Interop.PowerPoint.Application;
|
var app = appToRelease as Microsoft.Office.Interop.PowerPoint.Application;
|
||||||
if (app != null)
|
if (app != null)
|
||||||
{
|
{
|
||||||
app.PresentationOpen -= OnPresentationOpenInternal;
|
app.PresentationOpen -= OnPresentationOpenInternal;
|
||||||
@@ -413,20 +419,20 @@ namespace Ink_Canvas.Helpers
|
|||||||
LogHelper.WriteLogToFile($"[ROT] 取消 PPT 事件注册失败: {ex}", LogHelper.LogType.Warning);
|
LogHelper.WriteLogToFile($"[ROT] 取消 PPT 事件注册失败: {ex}", LogHelper.LogType.Warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Marshal.IsComObject(_pptApplication))
|
if (Marshal.IsComObject(appToRelease))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Marshal.FinalReleaseComObject(_pptApplication);
|
Marshal.FinalReleaseComObject(appToRelease);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int refCount = Marshal.ReleaseComObject(_pptApplication);
|
int refCount = Marshal.ReleaseComObject(appToRelease);
|
||||||
while (refCount > 0)
|
while (refCount > 0)
|
||||||
{
|
{
|
||||||
refCount = Marshal.ReleaseComObject(_pptApplication);
|
refCount = Marshal.ReleaseComObject(appToRelease);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
@@ -434,8 +440,6 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_pptApplication = null;
|
|
||||||
|
|
||||||
GC.Collect();
|
GC.Collect();
|
||||||
GC.WaitForPendingFinalizers();
|
GC.WaitForPendingFinalizers();
|
||||||
GC.Collect();
|
GC.Collect();
|
||||||
@@ -454,21 +458,30 @@ namespace Ink_Canvas.Helpers
|
|||||||
|
|
||||||
System.Threading.Thread.Sleep(200);
|
System.Threading.Thread.Sleep(200);
|
||||||
|
|
||||||
_isModuleUnloading = false;
|
lock (_lockObject)
|
||||||
if (!_disposed)
|
{
|
||||||
_unifiedRotTimer?.Start();
|
_isModuleUnloading = false;
|
||||||
|
if (!_disposed)
|
||||||
|
_unifiedRotTimer?.Start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"[ROT] 重新进入监控状态失败: {ex}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"[ROT] 重新进入监控状态失败: {ex}", LogHelper.LogType.Error);
|
||||||
_isModuleUnloading = false;
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
_isModuleUnloading = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"[ROT] 断开 PPT 连接失败: {ex}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"[ROT] 断开 PPT 连接失败: {ex}", LogHelper.LogType.Error);
|
||||||
_isModuleUnloading = false;
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
_isModuleUnloading = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
Reference in New Issue
Block a user