0

我收到错误消息:

System.Runtime.InteropServices.COMException (0x80080005):检索具有 CLSID {91493441-5A91-11CF-8700-00AA0060263B} 的组件的 COM 类工厂失败,原因是以下错误:80080005。

用于线PowerPoint.Application PowerPoint_App = new PowerPoint.Application();

对于这里的代码块:

using (new Impersonator(Installs.Current.PPTUser, null, Installs.Current.PPTPassword))
{
    PowerPoint.Application PowerPoint_App = new PowerPoint.Application();
    PowerPoint.Presentation presentation = null;
    try
    {
        PowerPoint_App.Visible = MsoTriState.msoTrue;
        presentation = PowerPoint_App.Presentations.Open(
            strPptFilePath, Microsoft.Office.Core.MsoTriState.msoFalse,
            Microsoft.Office.Core.MsoTriState.msoFalse,
            Microsoft.Office.Core.MsoTriState.msoTrue);

        for (int i = 0; i < presentation.Slides.Count; i++)
        {
            readSlides(presentation, i);
        }
        presentation.Close();
        PowerPoint_App.Quit();
    }
    catch (Exception ex)
    {
        strSuccess = ex.ToString();
        MindMatrix.Libraries.Entities.ExceptionMessage.HandleException(ex, null);
    }
    finally
    {
        Marshal.FinalReleaseComObject(presentation);
        Marshal.FinalReleaseComObject(PowerPoint_App);
    }
}

每当我第一次运行代码时,它都能完美运行,但随后它会为 PowerPoint 创建进程(可以在任务管理器中看到)。我曾经PowerPoint_App.Quit();退出已经打开的进程,但它不起作用并抛出错误。我去任务管理器并从那里结束进程,然后它准备好再工作一次。

从代码中退出进程时我做错了什么还是有其他方法可以做到这一点?

4

2 回答 2

3

好吧,事情就这样过去了。我提到了所有可能的解决方案。从杀死、退出、关闭、Marshal.FinalReleaseComObject、GC Collect 和 WaitForPendingFinalizers。但没有什么对我有用。所以我发现了正在运行的进程并通过代码将其杀死。并且bamn一切都按我预期的方式工作。

代码:

  Process[] pros = Process.GetProcesses();
    for (int i = 0; i < pros.Count(); i++)
         {
           if (pros[i].ProcessName.ToLower().Contains("powerpnt"))
                {
                  pros[i].Kill();
                }
         }

需要命名空间:

系统诊断

于 2013-06-11T06:50:25.057 回答
0

请参阅Application.Quit() 方法无法清除进程

还有一个选项,让你的应用程序检查 exe 是否正在运行,尝试在你的 finally 中手动杀死它,但我强烈建议不要这样做。

于 2013-06-03T15:41:16.473 回答