문제

응용 프로그램에서 PowerPoint를 열고 모든 슬라이드를 내보내는 스크립트가 있습니다. 그 후에는 신청서를 닫아야합니다.

나는 운이없는 노력을 기울였습니다. 도와 주시겠습니까?

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Powerpoint = Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint;
using System.Runtime.InteropServices;

namespace PresentrBuilder
{


class PowerpointConverter
{

    public static void Convert(String file, String safeFile)
    {
        Powerpoint.Application PP;
        Powerpoint.Presentation Presentation;

        PP = new Powerpoint.ApplicationClass();
        PP.Visible = MsoTriState.msoTrue;
        PP.WindowState = Microsoft.Office.Interop.PowerPoint.PpWindowState.ppWindowMinimized;
        Presentation = PP.Presentations.Open(file, MsoTriState.msoFalse, MsoTriState.msoTrue, MsoTriState.msoTrue);

            // Voor elke slide, exporteren
            String exportSlidesPath = Path.Combine(Properties.Settings.Default.CacheDir, @"presentatienaam1\slides");

            // Kijk of de directory bestaat
            if (!Directory.Exists(exportSlidesPath))
            {
                Directory.CreateDirectory(exportSlidesPath);
            }

                // Kijk of er al bestanden in de directory staan
                // Zo ja: verwijderen
                String[] files = Directory.GetFiles(exportSlidesPath, "*.png");
                if (files.Length > 0)
                {
                    foreach (string fileName in files)
                    {
                        File.Delete(Path.Combine(exportSlidesPath, fileName));
                    }
                }

            // Elke slide exporteren
            foreach (Slide slide in Presentation.Slides)
            {
                slide.Export(Path.Combine(exportSlidesPath, "slide_" + slide.SlideIndex + ".png"), "PNG", 1024, 768);
                Marshal.ReleaseComObject(slide);
            }


        GC.Collect();
        GC.WaitForPendingFinalizers();

        Marshal.ReleaseComObject(PP.Presentations);
        Marshal.ReleaseComObject(Presentation.Slides);

        Presentation.Close();
        Marshal.FinalReleaseComObject(Presentation);

        PP.Quit();
        Marshal.FinalReleaseComObject(PP);

    }

}
}
도움이 되었습니까?

해결책

동일한 주제에 대한 토론을 참조하십시오. C# 및 Excel Automation- 실행중인 인스턴스 종료

Excel을 다루지 만 원칙은 정확히 동일합니다.

요약 : "릴리스"가 필요합니다 Presentations, Slides 그리고 (다중) Slide 사물. BTW, 나는 변수를 null로 설정하지 않을 것입니다. 그것은 필요하거나 도움이되지 않습니다.

다른 팁

다른 사람 이이 문제로 어려움을 겪고 있다면 (슬라이드를 반복 한 후 PPT를 닫을 수 없음), 모든 쓰레기 수집을 수행하고 자원을 공개 한 후에도 오늘이 머리를 긁는 데 더 나은 부분을 보냈습니다. 내 해결책은 슬라이드를 통해 반복하기 위해 foreach를 사용하는 대신 다음과 같이했습니다.

        Microsoft.Office.Interop.PowerPoint.Application powerpoint;
        Microsoft.Office.Interop.PowerPoint.Presentation presentation;
        Microsoft.Office.Interop.PowerPoint.Presentations presentations;

        powerpoint = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();
        powerpoint.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
        presentations = powerpoint.Presentations;

        presentation = presentations.Open(localPath, MsoTriState.msoFalse, MsoTriState.msoTrue, MsoTriState.msoTrue);


        //String presentationTitle = objPres.Name;
        Microsoft.Office.Interop.PowerPoint.Slides slides = presentation.Slides;
        **for (int i = 1; i <= slides.Count; i++)
        {
            Microsoft.Office.Interop.PowerPoint.Slide slide = slides[i];
            String slideName = slide.Name;
            releaseCOM(slide);
        }**

이것은 내 릴리스 콤 메소드입니다.

    private static void releaseCOM(object o)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(o);
        }
        catch { }
        finally
        {
            o = null;
        }
    }

Gary의 답변에 추가하여 : 컬렉션을 공개하려면 임시 변수에 할당해야합니다. (아래 예제에서 슬라이드와 프리젠 테이션을 임시 변수로 사용했습니다).

  // removed using statements...

    namespace PresentrBuilder
    {


      class PowerpointConverter
      {

      public static void Convert(String file, String safeFile)
      {
        Powerpoint.Application PP;
        Powerpoint.Presentation Presentation;

        PP = new Powerpoint.ApplicationClass();
        // ...
        var presentations = PP.Presentations;
           try
            {
        Presentation = presentations.Open(file, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);

            // Voor elke slide, exporteren
            // ...

            // Elke slide exporteren
            var slides = Presentation.Slides;

            foreach (Slide slide in slides)
            {
                slide.Export(Path.Combine(exportSlidesPath, "slide_" + slide.SlideIndex + ".png"), "PNG", 1024, 768);
                Marshal.ReleaseComObject(slide);
            }
  Marshal.ReleaseComObject(presentations);
        Marshal.ReleaseComObject(slides);

        Presentation.Close();
        Marshal.FinalReleaseComObject(Presentation);
         }
        catch (System.Exception err){}
        finally{

       // GC.WaitForPendingFinalizers();    

        PP.Quit();
        Marshal.FinalReleaseComObject(PP);
        GC.Collect();
      } 
 } } }

VB.NET 응용 프로그램에서 PowerPoint를 열고 슬라이드 쇼를 실행 한 다음 나중에 닫는 코드가 있습니다. 내가 나중에 떨어 뜨려야 할 모든 com 객체를 찾는 것은 엉덩이의 진정한 고통이었습니다. 코드는 다음과 같습니다.

Imports MSWord = Microsoft.Office.Interop.Word
Imports MSPowerPt = Microsoft.Office.Interop.PowerPoint
Imports MSExcel = Microsoft.Office.Interop.Excel

Dim MSPowerPtApp As MSPowerPt.Application
Dim MSPowerPtPresentation As MSPowerPt.Presentation
Dim MSPowerPtPresentations As MSPowerPt.Presentations
Dim MSPowerPtSettings As MSPowerPt.SlideShowSettings
Dim MSPowerPtSlideShowWindow As MSPowerPt.SlideShowWindow
Dim MSPowerPtSlideShowWindows As MSPowerPt.SlideShowWindows

Function Display_PowerPoint_Show(ByVal filename As String)
  Dim MSPowerPtSlides As MSPowerPt.Slides
  Display_PowerPoint_Show = True
  Try
    If (Not FileExists(filename)) Then
      Display_PowerPoint_Show = False
      MsgBox("Display_PowerPoint_Show: Text file: " & filename & " not found", MsgBoxStyle.Information, "File Not Found")
      GoTo Exit_Display_PowerPoint_Show
    End If

    MSPowerPtApp = New MSPowerPt.Application
    MSPowerPtApp.Visible = True
    MSPowerPtApp.WindowState = MSPowerPt.PpWindowState.ppWindowMinimized

    'Create a new presentation that is based on the specified template.
    MSPowerPtPresentations = MSPowerPtApp.Presentations
    MSPowerPtPresentation = MSPowerPtPresentations.Open(lbFiles.SelectedValue, True)
    MSPowerPtSlides = MSPowerPtPresentation.Slides

    If (MSPowerPtSlides.Count = 0) Then
      MsgBox("This Powerpoint file has no slides", MsgBoxStyle.Information, "No Slides in File")
      GoTo ClosePowerPointFile
    End If

    MSPowerPtSettings = MSPowerPtPresentation.SlideShowSettings
    MSPowerPtSettings.StartingSlide = 1
    MSPowerPtSettings.EndingSlide = 1

    ''Run the slide show and wait for the slide show to end.
    MSPowerPtSlideShowWindow = MSPowerPtSettings.Run()
    MSPowerPtSlideShowWindows = MSPowerPtApp.SlideShowWindows

    Do While MSPowerPtSlideShowWindows.Count >= 1
      System.Windows.Forms.Application.DoEvents()
    Loop

    'Close the presentation without saving changes and then quit MSPowerPt.
    MSPowerPtPresentation.Saved = True
    MSPowerPtPresentation.Close()

    RemoveComObjRef(MSPowerPtSlideShowWindow)
    RemoveComObjRef(MSPowerPtSlideShowWindows)
    RemoveComObjRef(MSPowerPtSettings)

ClosePowerPointFile:
    RemoveComObjRef(MSPowerPtSlides)
    RemoveComObjRef(MSPowerPtPresentation)
    RemoveComObjRef(MSPowerPtPresentations)

    'Quit MSPowerPt.
    MSPowerPtApp.Quit()
    RemoveComObjRef(MSPowerPtApp)
    GC.Collect()

  Catch ex As Exception
    Display_PowerPoint_Show = False
    MsgBox("Display_PowerPoint_Show - File: " & filename & ", Error: " & ex.Message & " reading file", _
           MsgBoxStyle.Information, "Error Reading File")
  End Try

Exit_Display_PowerPoint_Show:
End Function

'RemoveComObjRef function to remove reference.
Private Sub RemoveComObjRef(ByVal ComObject As Object)
  Try
    System.Runtime.InteropServices.Marshal.ReleaseComObject(ComObject)
  Catch
  Finally
    ComObject = Nothing
  End Try
End Sub

나는 이것이 누군가가 내가 넣어야 할 추가 노력을 건너 뛰는 데 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top