- 締切済み
【.NET】PowerPointのSlideオブジェクトの解放について
こんにちは,.NETでOfficeを扱う際の解放について勉強をしております. 質問させていただきます.どうぞよろしくお願いいたします. PPT2007の文字を操作しておりますが, Dim myAPP As PowerPoint.Application myAPP = CreateObject("PowerPoint.Application") Dim myAPPpre As PowerPoint.Presentation ・・・ myAPPpre = myAPPpres.Open(Mypath & FName, WithWindow:=Microsoft.Office.Core.MsoTriState.msoFalse) のあと, Dim myS As PowerPoint.Slide Dim mySlides As PowerPoint.Slides ・・・・・ mySlides = myAPPpre.Slides MRComObject(mySlides) : mySlides = Nothing だとPOWERPNT.EXEがすぐに解放されますが, Dim myS As PowerPoint.Slide Dim mySlides As PowerPoint.Slides ・・・・・ mySlides = myAPPpre.Slides For Each myS In mySlides '追加行 MRComObject(myS) : myS = Nothing '追加行 Next '追加行 MRComObject(mySlides) : mySlides = Nothing と,Slideオブジェクトを入れると解放されなくなってしまいます. 文字列の操作は正常に動作いたしますが. 「Dim myS As PowerPoint.」まで打ったところで一覧で出される候補名を確認しましたところ Slideだけ,Slides等他のオブジェクトとロゴマークが異なるのですが,これは関係あるのでしょうか?? またこの一覧の下の方に「_Slides」なるものも見つけ試してみましたが,うまくいきません. OKWaveでアドバイスいただく前にネット検索につきましてもしっかり行ってみたつもりなのですが, よくわかりませんでした.(もし検索が下手でしたらどうもすみません...) もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたくお願いいたします. どうぞよろしくお願いします.
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- phoenix343
- ベストアンサー率15% (296/1946)
#1です。 レスを見ましたが、ちゃんと理解してから使うようにしてください、、 このMRComObjectに渡しているなら、 MRComObject(myS)もNextの後にしないとだめでしょう。 だってmyS = Nothingと同じようなことしてるんですから。 「ReleaseComObject」で検索かけてみてください。 どういう処理なのかおぼろげながら分かるかなと思います。 ※OfficeにあるオブジェクトはすべてCOM化してると考えればOK
- phoenix343
- ベストアンサー率15% (296/1946)
PowerPointは持ってないので憶測ですけど。 追加行のNextの前にあるmyS = Nothingは要りません。 要るとしたらNextの後でしょう。 あと追加行で指定してるMRComObjectの引数とNextの後で指定してる引数が気になります。同じオブジェクトの型では無いのはお分かりですよね?
補足
phoenix343 様 どうもありがとうございます. アドバイスいただいた通りmyS = Nothing はNext直後に修正いたしました. 「オブジェクトの型」につきましてはmySがSlideで,mySlidesがSlides ということでしょうか?? MRComObjectの引数??・・でございますか.すみません, きちんと理解していないです.どのオブジェクトについても同じ 以下のコードを使用しております. Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) Debug.WriteLine(count) End If End If Finally objCom = Nothing End Try End Sub ネットでコピペしていただいてきたものです. Wordで同じことを試みると,上のコードで共通使用して解放できたので, 今回もこれを前オブジェクト共通で使用しております.意味分からず使用しておりますが.. もし何かお気づきになること等ございましたら, 是非ともアドバイスをよろしくお願いいたします.
お礼
phoenix343様 ご回答どうもありがとうございます! 色々と調べております. 以前エラーで「Reintrancyが検出されました~」というのが多発して困った際に, 毎回Nextの前で解放するとうまくいき始めたのがきっかけでこのようにしております. どうもすみません.OSの環境を明記しておりませんでした. 今うまく解放したい動作環境がVista+PPT2007になりますが, 今日別のPC(Win2000+Office2000)で試してみたところ,何故か解放されました. OSの影響かOfficeのバージョンなのか分かりませんでしたが... もし何か些細なことでもご指摘・アドバイスいただけることがございましたら, 是非ともよろしくお願いいたします.