- - PR -
ASP.NETで起動したPOWERPOINTのプロセスが終了しない
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-11-10 15:03
いつもお世話になっております。
環境は、 WINDOWS 2000 VB.NET 2003 です。 ASP.NETでクライアント側からサーバー上のPOWERPOINTをサーバー上で起動し、ソース内で アプリケーションを終了させているのですが、サーバーでPOWERPOINTのプロセスが残ったまま になっています。 過去スレを参考させていただき、いろいろ試したのですが、解決に至りませんでした。 ソース 'ASP.NET アプリケーションに偽装を実装します。 Dim impersonationContext As System.Security.Principal.WindowsImpersonationContext Dim currentWindowsIdentity As System.Security.Principal.WindowsIdentity currentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity) impersonationContext = currentWindowsIdentity.Impersonate() '認証中のユーザーのセキュリティ コンテキストで実行するコードをここに挿入します。 ConstsTemplate= "C:\Inetpub\wwwroot\test\test.ppt" Dim oApp As New PowerPoint.Application Dim oSlide As PowerPoint.Slide Dim bAssistantOn As Boolean oApp.Visible = True '指定したテンプレートを基に新しいプレゼンテーションを作成します。 Dim oPres As PowerPoint.Presentation = oApp.Presentations.Open(sTemplate, , , True) '変更を保存してプレゼンテーションを閉じ、PowerPoint を終了します。 oPres.Save() oPres.Close() oApp.Quit() oSlide = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(oPres) oPres = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(oApp) oApp = Nothing 'アプリケーションが終了しなかったため、再度NEWしてアプリケーションを閉じます oApp = New PowerPoint.Application oApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(oApp) oApp = Nothing System.GC.Collect() impersonationContext.Undo() プロセスをKILLなどで、強制終了はしたくありません。 どんなことでもよいので、お教えください。 お願いします。 |
|
投稿日時: 2004-11-10 16:11
oApp.Presentations.Open
これが、問題のような気がします。 マイクロソフト サポート技術情報 - 317109 [PRB] Visual Studio .NET クライアントで自動化した Office アプリケーションが終了しない http://support.microsoft.com/default.aspx?scid=kb;ja;317109 「オブジェクト名.プロパティ名.プロパティ名.メソッド名」 などというように、ネストさせることに問題があります。 COM にアクセスする際に、RCW というラッパーが自動生成されますが、その制限です。 すべてのコードは 「オブジェクト名.プロパティ名」または、「オブジェクト名.メソッド名」 のように単階層化させる必要があります。 |
|
投稿日時: 2004-11-10 17:38
daiさんご返答ありがとうございます。
daiさんのご返答より引用;------------------------------------------------------ oApp.Presentations.Open これが、問題のような気がします。 ----------------------------------------------------------------------------- >上記の部分をはずして実行したところ、プロセスは終了されました。 原因が分かりました。ありがとうございます。 daiさんのご返答より引用;----------------------------------------------------- 「オブジェクト名.プロパティ名.プロパティ名.メソッド名」 などというように、ネストさせることに問題があります。 COM にアクセスする際に、RCW というラッパーが自動生成されますが、その制限です。 すべてのコードは 「オブジェクト名.プロパティ名」または、「オブジェクト名.メソッド名」 のように単階層化させる必要があります。 ----------------------------------------------------------------------------- >なるほど、勉強になります。 しかし、 Dim oPres As PowerPoint.Presentation = oApp.Presentations.Open(sTemplate, , , True) 上記のロジックをどのように単階層化させてよいのか悩んでいます。 試しにいろいろと分解したのですが、今のところダメなままです。 あつかましいですが、ヒントでも構いません。 教えていただきたいです。 |
|
投稿日時: 2004-11-10 17:58
daiさん、ありがとうございました。
プロセスの終了に成功しました。 Dim oPres As PowerPoint.Presentations = oApp.Presentations Dim oPre As PowerPoint.Presentation oPre = oPres.Open(sTemplate, , , True) 上記のように変更しました。 勉強になりました。 |
1