diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 07ba61ae..777a4652 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -29,9 +29,16 @@ namespace Ink_Canvas { private void BtnCheckPPT_Click(object sender, RoutedEventArgs e) { try { - pptApplication = - (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("kwpp.Application"); - + pptApplication = null; + // 优先检测WPS(wpp.Application),获取不到再尝试PowerPoint + try { + pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("wpp.Application"); + } catch { } + if (pptApplication == null) { + try { + pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application"); + } catch { } + } if (pptApplication != null) { //获得演示文稿对象 presentation = pptApplication.ActivePresentation; @@ -45,16 +52,14 @@ namespace Ink_Canvas { memoryStreams = new MemoryStream[slidescount + 2]; // 获得当前选中的幻灯片 try { - // 在普通视图下这种方式可以获得当前选中的幻灯片对象 - // 然而在阅读模式下,这种方式会出现异常 slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber]; } catch { - // 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象 - slide = pptApplication.SlideShowWindows[1].View.Slide; + try { + slide = pptApplication.SlideShowWindows[1].View.Slide; + } catch { } } } - if (pptApplication == null) throw new Exception(); StackPanelPPTControls.Visibility = Visibility.Visible; } @@ -387,25 +392,7 @@ namespace Ink_Canvas { pptApplication.SlideShowEnd -= PptApplication_SlideShowEnd; // 释放COM对象 - if (slide != null) { - Marshal.ReleaseComObject(slide); - slide = null; - } - - if (slides != null) { - Marshal.ReleaseComObject(slides); - slides = null; - } - - if (presentation != null) { - Marshal.ReleaseComObject(presentation); - presentation = null; - } - - if (pptApplication != null) { - Marshal.ReleaseComObject(pptApplication); - pptApplication = null; - } + ReleasePptResources(); timerCheckPPT.Start(); @@ -1226,5 +1213,18 @@ namespace Ink_Canvas { LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); } } + + // 统一释放PPT相关COM对象,防止内存泄漏 + private void ReleasePptResources() + { + try { if (slide != null) Marshal.ReleaseComObject(slide); } catch { } + slide = null; + try { if (slides != null) Marshal.ReleaseComObject(slides); } catch { } + slides = null; + try { if (presentation != null) Marshal.ReleaseComObject(presentation); } catch { } + presentation = null; + try { if (pptApplication != null) Marshal.ReleaseComObject(pptApplication); } catch { } + pptApplication = null; + } } } \ No newline at end of file diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.FileListAbsolute.txt b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.FileListAbsolute.txt index 13b0d95b..929347a8 100644 --- a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.FileListAbsolute.txt +++ b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.FileListAbsolute.txt @@ -390,3 +390,4 @@ E:\ICC CE\ICC CE main\ICC-CE\Ink Canvas\obj\Debug\net472\InkCanvasForClass.cspro E:\ICC CE\ICC CE main\ICC-CE\Ink Canvas\obj\Debug\net472\InkCanvasForClass.sourcelink.json E:\ICC CE\ICC CE main\ICC-CE\Ink Canvas\obj\Debug\net472\InkCanva.0F57E7D5.Up2Date E:\ICC CE\ICC CE main\ICC-CE\Ink Canvas\obj\Debug\net472\InkCanvasForClass.exe +E:\ICC CE\ICC CE main\ICC-CE\Ink Canvas\obj\Debug\net472\InkCanvasForClass.exe.config diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.ResolveComReference.cache b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.ResolveComReference.cache index ce5fac1f..c475a20c 100644 Binary files a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.ResolveComReference.cache and b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.ResolveComReference.cache differ