2

如果我通过自动化创建 PowerPoint 应用程序,则当用户关闭主窗口时,该过程仍保留在任务管理器中。我可以假设这是因为我的应用程序持有对 PowerPoint 应用程序的引用,因此它不能被垃圾收集。但是我怎么知道用户关闭了 PowerPoint 应用程序以便我可以释放对它的所有引用呢?这里似乎是鸡或蛋的问题。以下是我在表单加载时调用的函数。如果 PowerPoint 已打开,则它使用当前实例。如果没有,它会创建一个新实例。

Private Function TryAttachToApplication() As PowerPoint.Application
        Dim app As PowerPoint.Application

        Try
            app = CType(Marshal.GetActiveObject("PowerPoint.Application"), PowerPoint.Application)
        Catch ex As COMException
            app = New PowerPoint.Application
        End Try

        app.Visible = True
        Return app
End Function
4

1 回答 1

1

如果 PowerPoint 已打开,则它使用当前实例。如果没有,它会创建一个新实例。

我不这么认为。PowerPoint 只允许它自己的一个实例,尽管有时它在自动化时会错误地留下僵尸实例。它的行为不像 Word 或 Excel,您可以根据需要创建自己的 add'l 实例。

如果已经有一个实例正在运行,您将获得对它的引用。如果没有正在运行的实例,您将创建一个新实例并获得对它的引用。

释放对 PPT 实例的引用应该不会导致任何问题。如果用户一开始就打开它,它应该保持打开状态。

问题更可能是:“我应该调用 PPT 应用程序的 .Quit 方法吗?”

一种方法是检查 app.Presentations.Count 我不记得 PPT 在通过自动化调用时是否会自动创建一个新的空白演示文稿;我记得,它没有,但你会想要仔细检查。IAC,如果 .Count > 0(或者可能是 1),您知道您已经获得了对 PPT 的预先存在实例的引用...即,有人已经在使用它...所以您不想退出他们。

于 2012-05-03T15:20:59.613 回答