2012-05-03 16 views
2

オートメーションを使用してPowerPointアプリケーションを作成すると、メインウィンドウを閉じたときにプロセスがタスクマネージャに残ります。これは、私のアプリケーションが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 

答えて

1

パワーポイントがすでに開かれている場合、それは現在のインスタンスを使用しています。そうでない場合は、新しいインスタンスを作成します。

私はそうは思わない。 PowerPointは自動的に1つのインスタンスのみを許可しますが、自動化されたときにゾンビインスタンスを誤って残すことがあります。 WordやExcelのように動作しません。必要に応じて独自のインスタンスを作成できます。

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

PPTインスタンスへの参照を解放しても問題はありません。ユーザーがそれを開いて開いていれば、開いたままにしておく必要があります。

問題はおそらく、「私はPPTアプリケーションの.Quitメソッドを呼び出す必要がありますか?」

これは、app.Presentations.Countを確認することです。 オートメーション経由でPPTが新しい空白のプレゼンテーションを自動的に作成するかどうかはわかりません。私が思い出すように、それはしませんが、あなたはそれをもう一度チェックしたいでしょう。 IACの場合、.Count> 0(またはおそらく1)の場合、PPTの既存のインスタンスへの参照を取得したことを知っている...つまり、誰かがすでにそれを使用しているので...終了したくないそれら。

関連する問題