Handle RPC failures during PPT disconnect (#412)
This commit is contained in:
@@ -1410,12 +1410,24 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile("PPTApplication COM对象已失效,跳过释放", LogHelper.LogType.Trace);
|
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)
|
catch (InvalidComObjectException)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile("PPTApplication COM对象已失效,跳过释放", LogHelper.LogType.Trace);
|
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)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"释放PPTApplication时发生异常: {ex.Message}", LogHelper.LogType.Warning);
|
LogHelper.WriteLogToFile($"释放PPTApplication时发生异常: {ex.Message}", LogHelper.LogType.Warning);
|
||||||
@@ -1500,6 +1512,13 @@ namespace Ink_Canvas.Helpers
|
|||||||
LogHelper.WriteLogToFile($"COM对象 {objectName} 已失效,跳过释放", LogHelper.LogType.Trace);
|
LogHelper.WriteLogToFile($"COM对象 {objectName} 已失效,跳过释放", LogHelper.LogType.Trace);
|
||||||
return;
|
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);
|
int refCount = Marshal.ReleaseComObject(comObject);
|
||||||
LogHelper.WriteLogToFile($"已释放COM对象 {objectName},引用计数: {refCount}", LogHelper.LogType.Trace);
|
LogHelper.WriteLogToFile($"已释放COM对象 {objectName},引用计数: {refCount}", LogHelper.LogType.Trace);
|
||||||
@@ -1513,7 +1532,8 @@ namespace Ink_Canvas.Helpers
|
|||||||
catch (COMException comEx)
|
catch (COMException comEx)
|
||||||
{
|
{
|
||||||
var hr = (uint)comEx.HResult;
|
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)
|
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()
|
private void UpdateCurrentPresentationInfo()
|
||||||
{
|
{
|
||||||
object activeWindow = null;
|
object activeWindow = null;
|
||||||
@@ -3516,4 +3545,3 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user