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 は、それ自体の 1 つのインスタンスのみを許可しますが、自動化されたときに誤ってゾンビ インスタンスを残すことがあります。必要に応じて独自の追加インスタンスを作成できる Word や Excel のようには動作しません。

実行中のインスタンスが既にある場合は、そのインスタンスへの参照を取得します。実行中のインスタンスがない場合は、新しいインスタンスを作成し、それへの参照を取得します。

PPT インスタンスへの参照を解放しても問題は発生しません。ユーザーが最初から開いていた場合は、開いたままにする必要があります。

問題は、「PPT アプリケーションの .Quit メソッドを呼び出す必要がありますか?」という可能性が高くなります。

そのための 1 つの方法は、app.Presentations.Count を確認することです。オートメーション経由で呼び出されたときに、PPT が新しい空白のプレゼンテーションを自動的に作成するかどうかは思い出せません。私が思い出したように、そうではありませんが、それを再確認する必要があります。IAC、.Count > 0 (またはおそらく 1) の場合、PPT の既存のインスタンスへの参照を取得したことがわかります...つまり、誰かが既にそれを使用しています...だから、やめたくありません彼ら。

于 2012-05-03T15:20:59.613 に答える