- - PR -
PowerPointのプロセスが終了しません
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-11-11 19:28
いつもお世話になっております
環境は、 Windows 2000 VB.NET 2003 です。 VB.NETのWEB上でサーバーにあるPowerPointをサーバー側で起動しています。 その際、スライドショーを実行しなければPowerPointのプロセスを終了できるのですが、 スライドショーをプログラムで実行させて、アプリケーションを閉じてもプロセスが 残ったままになっています。 ソース oApp = New PowerPoint.Application oSlidesActPre = oApp.ActivePresentation Dim oSettings As PowerPoint.SlideShowSettings Dim oAppSlideWindows As PowerPoint.SlideShowWindows oSettings = oSlidesActPre.SlideShowSettings oAppSlideWindows = oApp.SlideShowWindows 'スライド ショーを実行し、スライド ショーが完了するまで待機します。 oSettings.Run() Do While oAppSlideWindows.Count >= 1 Loop NAR(oAppSlideWindows) NAR(oSettings) NAR(oSlidesActPre) NAR(oApp) Private Sub NAR(ByVal o As Object) Try System.Runtime.InteropServices.Marshal.ReleaseComObject(o) Catch Finally o = Nothing End Try End Sub 上記の「oSettings.Run()」を取るだけで、プロセスは終了します。 どなたか原因が分かる方いらっしゃいましたら、お教えください。 |
|
投稿日時: 2004-11-11 22:47
回答ではありません。
クライアントからサーバでスライドショウを実行させる?どういう要件なのでしょう?私の理解では、サーバ側には人はいないので、「見る人のいないスライドショウを実行する」ことに意味を見いだせません。 また、複数の人が同時にアクセスした場合、どうなるのでしょう? _________________ |
|
投稿日時: 2004-11-12 09:56
Jittaさん、ご返答ありがとうございました。
引用;------------------------------------------------------------------------ クライアントからサーバでスライドショウを実行させる?どういう要件なのでしょう?私の理解では、サーバ側には人はいないので、「見る人のいないスライドショウを実行する」ことに意味を見いだせません。 また、複数の人が同時にアクセスした場合、どうなるのでしょう? ----------------------------------------------------------------------------- すみません。説明の意図がわからない事を書いてしまいました。 もう一度説明させていただきます。 自身のlocalhostのWeb上から自PC内にあるPowerPointを起動させています。 クライアントからのアクセスでは、クライアント側にPowerPointは起動させていません。 アクセスされた側で、PowerPointを起動し、プログラム内部で内容を変更して保存しているだけです。 複数のアクセスがあった場合は、PowerPointを閉じるまでLoop処理にて待機させています。 |
|
投稿日時: 2004-11-12 16:34
ASP.NETを使用して、サーバー側でPowerPointの自動実行を行いたい、という要件とみましたが、サーバーサイドのOfficeオートメーションはマイクロソフトのサポート対象外となってしまいます。
Office のサーバーサイド オートメーションについて http://support.microsoft.com/kb/257757/JA/ それでもサーバー側でOfficeオートメーションを使用する必要がある場合、 対話型ユーザー アカウントで実行するように Office アプリケーションを構成する方法 http://support.microsoft.com/kb/288366 特定のユーザー アカウントで実行されるように Office アプリケーションを構成する方法 http://support.microsoft.com/kb/288367 COM+/MTS パッケージからオートメーション用に Office アプリケーションを構成する方法 http://support.microsoft.com/kb/288368 を参考に、DCOM等の設定を行う必要があります。 |
|
投稿日時: 2004-11-12 19:59
kanaiさんご返答ありがとうございました。
いろいろ調べてみたところ、アプリケーションを終了しても、内部的な終了処理に 時間がかかっているみたいで、7分?ぐらいしたらプロセスは消えていました。 コードの書き方や、プログラムから命令する処理(スライドショーの実行、画像の貼り付けなど )により、内部的な終了処理に時間がかかるみたいです。 また、私には違いは分からないのですが、Webフォームではプロセスは残っていましたが、 Windowsフォームではアプリケーションを終了した後、すぐにプロセスも終了していました。 そこで、教えてほしいのです。 実際できるのか分からないのですが、プロセスの終了を速める方法。 また、WebフォームでプロセスをKILLする方法などございませんでしょうか? |
|
投稿日時: 2004-11-12 22:28
もう一つのスレッドででているとおり、すべてのCOM参照を消してやるしかありません。
終了したらすぐに終わるのは、Webアプリでも同じです。“終了”のタイミングが違います。クライアントでブラウザを終了したときが「アプリケーションの終了」ではありません。 #あ、サーバ上でブラウザを動かしても、サーバがクライアントを兼ねている、 #と思ってください。 内部的な処理というのは、おそらくGCが動くまでの時間でしょう。もっとも、これはいつ動作するかわかりません。たまたま7分くらいで動いた、ということです。 ・・・つまり、参照をすべて外した後、GCを無理矢理動かしてやれば、終わってくれます。(ということを、2年前に立てたスレッドに書いたような?) _________________ |
|
投稿日時: 2004-11-15 11:34
Jittaさん、ご返答ありがとうございます。
引用;------------------------------------------------------------------------- Jittaさんのご返答(2004-11-12 22:28)より: すべてのCOM参照を消してやるしかありません。 つまり、参照をすべて外した後、GCを無理矢理動かしてやれば、終わってくれます。 ------------------------------------------------------------------------------ >私も自分なりに調べて、ロジックの書き方を、「オブジェクト名・プロパティ名」、「オブジェクト名・メソッド名」という風に単階層化させて RCWの参照を減らし、宣言して使用した変数もNothingに設定し 参照を開放しています。 その後、GC.Collect()にて、ガベージ コレクションを強制的に行っています。 そこで、スライドショーを実行しなければ、アプリケーションを終了し、参照を全てはずした 後、GC.collect()でプロセスは終了しています。 Jittaさんのおっしゃっていることはこの事だと思われます。 しかし、スライドショーをプログラム側から実行すると、プロセスが残っているという状況 になっています。 ですので、どうしたらよいか手詰まりになっています。 Processを終わらせる方法、またCOMを参照しているものを確認する方法、 などなど、どんなことでもかまいません。参考になることでもよいので お教えください。 |
|
投稿日時: 2004-11-15 12:20
サンプルがありました。
http://support.microsoft.com/default.aspx?scid=kb;ja;303718 最後にCloseとQuitが必要かも。 Do〜LoopにSleepを入れた方がよいでしょう。 |