如何正确处置/释放PowerPoint.DocumentWindow

时间:2014-12-24 18:24:56

标签: c# excel vsto powerpoint

问题:如何处理由父PPT流程创建的子Excel窗口?

  1. 我将图表从Excel复制到Power Point 2013
  2. 然后我在此图表上单击鼠标右键并选择"编辑数据"
  3. 将显示紧凑弹出窗口,其中包含此图表的源数据
  4. 我关闭了这个窗口,因为看起来这个窗口的句柄没有正确释放所以无法再打开它
  5. 如果Excel窗口中的某些数据发生更改,则以下是用于更新PPT Chart的代码。

    protected void UpdateSlide()
    {
        using (PresentationWrapper presentation = ParentSlide.Parent)
        using (DocumentWindowWrapper window = presentation.Windows[0]) // !!! here is the place where Com oject is maintained but needs to be released
        {
            window.Activate();
        }
    }
    

    这是不释放Com对象的包装器。

    public class DocumentWindowWrapper : ComWrapper<ppt.DocumentWindow>, IWindow
    {
        DocumentWindowWrapper wrapper;
    
        public static DocumentWindowWrapper CreateWrapper(ppt.DocumentWindow wrappedObject)
            wrapper = new DocumentWindowWrapper(wrappedObject);
            return wrapper;
        }
    
        public override void Dispose()
        {
            Marshal.ReleaseComObject(...); // !!! what should I put here to release this window?
            base.Dispose();
        }
    }
    

    这是我正在谈论的窗口。

    enter image description here

2 个答案:

答案 0 :(得分:0)

应使用ReleaseComObject方法释放底层COM对象( wrappedObject )。

答案 1 :(得分:0)

代码应如下所示:

开始使用工作表:

Worksheets sheets = excelApp.Worksheets; 
Worksheet sheet = sheets.Open(...);

然后发布(它们总是以创建的相反顺序发布):

Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(sheets);