@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ASP.NETで起動したPOWERPOINTのプロセスが終了しない

1
投稿者投稿内容
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 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などで、強制終了はしたくありません。
どんなことでもよいので、お教えください。
お願いします。
dai
ベテラン
会議室デビュー日: 2001/08/28
投稿数: 85
投稿日時: 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/08/19
投稿数: 50
投稿日時: 2004-11-10 17:38
daiさんご返答ありがとうございます。

daiさんのご返答より引用;------------------------------------------------------

oApp.Presentations.Open
これが、問題のような気がします。

-----------------------------------------------------------------------------
>上記の部分をはずして実行したところ、プロセスは終了されました。
原因が分かりました。ありがとうございます。

daiさんのご返答より引用;-----------------------------------------------------

「オブジェクト名.プロパティ名.プロパティ名.メソッド名」
などというように、ネストさせることに問題があります。
COM にアクセスする際に、RCW というラッパーが自動生成されますが、その制限です。
すべてのコードは 「オブジェクト名.プロパティ名」または、「オブジェクト名.メソッド名」
のように単階層化させる必要があります。

-----------------------------------------------------------------------------
>なるほど、勉強になります。
しかし、
Dim oPres As PowerPoint.Presentation = oApp.Presentations.Open(sTemplate, , , True)

上記のロジックをどのように単階層化させてよいのか悩んでいます。
試しにいろいろと分解したのですが、今のところダメなままです。
あつかましいですが、ヒントでも構いません。
教えていただきたいです。
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 2004-11-10 17:58
daiさん、ありがとうございました。

プロセスの終了に成功しました。

Dim oPres As PowerPoint.Presentations = oApp.Presentations
Dim oPre As PowerPoint.Presentation
oPre = oPres.Open(sTemplate, , , True)

上記のように変更しました。

勉強になりました。
1

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