- PR -

PowerPointのプロセスが終了しません

投稿者投稿内容
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 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()」を取るだけで、プロセスは終了します。
どなたか原因が分かる方いらっしゃいましたら、お教えください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-11 22:47
回答ではありません。


 クライアントからサーバでスライドショウを実行させる?どういう要件なのでしょう?私の理解では、サーバ側には人はいないので、「見る人のいないスライドショウを実行する」ことに意味を見いだせません。
 また、複数の人が同時にアクセスした場合、どうなるのでしょう?
_________________
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 2004-11-12 09:56
Jittaさん、ご返答ありがとうございました。

引用;------------------------------------------------------------------------

クライアントからサーバでスライドショウを実行させる?どういう要件なのでしょう?私の理解では、サーバ側には人はいないので、「見る人のいないスライドショウを実行する」ことに意味を見いだせません。
 また、複数の人が同時にアクセスした場合、どうなるのでしょう?
-----------------------------------------------------------------------------
すみません。説明の意図がわからない事を書いてしまいました。

もう一度説明させていただきます。

自身のlocalhostのWeb上から自PC内にあるPowerPointを起動させています。
クライアントからのアクセスでは、クライアント側にPowerPointは起動させていません。
アクセスされた側で、PowerPointを起動し、プログラム内部で内容を変更して保存しているだけです。
複数のアクセスがあった場合は、PowerPointを閉じるまでLoop処理にて待機させています。
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 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/08/19
投稿数: 50
投稿日時: 2004-11-12 19:59
kanaiさんご返答ありがとうございました。

いろいろ調べてみたところ、アプリケーションを終了しても、内部的な終了処理に
時間がかかっているみたいで、7分?ぐらいしたらプロセスは消えていました。
コードの書き方や、プログラムから命令する処理(スライドショーの実行、画像の貼り付けなど
)により、内部的な終了処理に時間がかかるみたいです。
また、私には違いは分からないのですが、Webフォームではプロセスは残っていましたが、
Windowsフォームではアプリケーションを終了した後、すぐにプロセスも終了していました。

そこで、教えてほしいのです。
実際できるのか分からないのですが、プロセスの終了を速める方法。
また、WebフォームでプロセスをKILLする方法などございませんでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-12 22:28
 もう一つのスレッドででているとおり、すべてのCOM参照を消してやるしかありません。

 終了したらすぐに終わるのは、Webアプリでも同じです。“終了”のタイミングが違います。クライアントでブラウザを終了したときが「アプリケーションの終了」ではありません。
#あ、サーバ上でブラウザを動かしても、サーバがクライアントを兼ねている、
#と思ってください。

 内部的な処理というのは、おそらくGCが動くまでの時間でしょう。もっとも、これはいつ動作するかわかりません。たまたま7分くらいで動いた、ということです。

・・・つまり、参照をすべて外した後、GCを無理矢理動かしてやれば、終わってくれます。(ということを、2年前に立てたスレッドに書いたような?)
_________________
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 2004-11-15 11:34
Jittaさん、ご返答ありがとうございます。

引用;-------------------------------------------------------------------------

Jittaさんのご返答(2004-11-12 22:28)より:
すべてのCOM参照を消してやるしかありません。
つまり、参照をすべて外した後、GCを無理矢理動かしてやれば、終わってくれます。

------------------------------------------------------------------------------

>私も自分なりに調べて、ロジックの書き方を、「オブジェクト名・プロパティ名」、「オブジェクト名・メソッド名」という風に単階層化させて
RCWの参照を減らし、宣言して使用した変数もNothingに設定し
参照を開放しています。
その後、GC.Collect()にて、ガベージ コレクションを強制的に行っています。
そこで、スライドショーを実行しなければ、アプリケーションを終了し、参照を全てはずした
後、GC.collect()でプロセスは終了しています。
Jittaさんのおっしゃっていることはこの事だと思われます。
しかし、スライドショーをプログラム側から実行すると、プロセスが残っているという状況
になっています。

ですので、どうしたらよいか手詰まりになっています。
Processを終わらせる方法、またCOMを参照しているものを確認する方法、
などなど、どんなことでもかまいません。参考になることでもよいので
お教えください。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-11-15 12:20
サンプルがありました。
http://support.microsoft.com/default.aspx?scid=kb;ja;303718

最後にCloseとQuitが必要かも。
Do〜LoopにSleepを入れた方がよいでしょう。

スキルアップ/キャリアアップ(JOB@IT)