Handle RPC failures during PPT disconnect (#412)

This commit is contained in:
CJK_mkp
2026-03-23 16:41:50 +08:00
committed by GitHub
parent 9bc9af5eec
commit 290e031f77
+30 -2
View File
@@ -1410,12 +1410,24 @@ namespace Ink_Canvas.Helpers
{
LogHelper.WriteLogToFile("PPTApplication COM对象已失效,跳过释放", LogHelper.LogType.Trace);
}
catch (COMException comEx) when (IsIgnorableDisconnectComException(comEx))
{
LogHelper.WriteLogToFile(
$"PPTApplication COM对象在断开连接时已不可用,跳过释放 (HR: 0x{(uint)comEx.HResult:X8})",
LogHelper.LogType.Trace);
}
}
}
catch (InvalidComObjectException)
{
LogHelper.WriteLogToFile("PPTApplication COM对象已失效,跳过释放", LogHelper.LogType.Trace);
}
catch (COMException comEx) when (IsIgnorableDisconnectComException(comEx))
{
LogHelper.WriteLogToFile(
$"释放PPTApplication时检测到COM对象已不可用,跳过释放 (HR: 0x{(uint)comEx.HResult:X8})",
LogHelper.LogType.Trace);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"释放PPTApplication时发生异常: {ex.Message}", LogHelper.LogType.Warning);
@@ -1500,6 +1512,13 @@ namespace Ink_Canvas.Helpers
LogHelper.WriteLogToFile($"COM对象 {objectName} 已失效,跳过释放", LogHelper.LogType.Trace);
return;
}
catch (COMException comEx) when (IsIgnorableDisconnectComException(comEx))
{
LogHelper.WriteLogToFile(
$"COM对象 {objectName} 在释放前已不可用,跳过释放 (HR: 0x{(uint)comEx.HResult:X8})",
LogHelper.LogType.Trace);
return;
}
int refCount = Marshal.ReleaseComObject(comObject);
LogHelper.WriteLogToFile($"已释放COM对象 {objectName},引用计数: {refCount}", LogHelper.LogType.Trace);
@@ -1513,7 +1532,8 @@ namespace Ink_Canvas.Helpers
catch (COMException comEx)
{
var hr = (uint)comEx.HResult;
LogHelper.WriteLogToFile($"释放COM对象 {objectName} 时COM异常: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning);
var logType = IsIgnorableDisconnectComException(comEx) ? LogHelper.LogType.Trace : LogHelper.LogType.Warning;
LogHelper.WriteLogToFile($"释放COM对象 {objectName} 时COM异常: {comEx.Message} (HR: 0x{hr:X8})", logType);
}
catch (Exception ex)
{
@@ -1521,6 +1541,15 @@ namespace Ink_Canvas.Helpers
}
}
private static bool IsIgnorableDisconnectComException(COMException comEx)
{
var hr = (uint)comEx.HResult;
return hr == 0x800706BA || // RPC server unavailable
hr == 0x80010108 || // object disconnected from clients
hr == 0x8001010D || // server died
hr == 0x800706BE; // remote procedure call failed
}
private void UpdateCurrentPresentationInfo()
{
object activeWindow = null;
@@ -3516,4 +3545,3 @@ namespace Ink_Canvas.Helpers
}