• 締切済み

【.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でアドバイスいただく前にネット検索につきましてもしっかり行ってみたつもりなのですが, よくわかりませんでした.(もし検索が下手でしたらどうもすみません...)  もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたくお願いいたします. どうぞよろしくお願いします.

みんなの回答

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

#1です。 レスを見ましたが、ちゃんと理解してから使うようにしてください、、 このMRComObjectに渡しているなら、 MRComObject(myS)もNextの後にしないとだめでしょう。 だってmyS = Nothingと同じようなことしてるんですから。 「ReleaseComObject」で検索かけてみてください。 どういう処理なのかおぼろげながら分かるかなと思います。 ※OfficeにあるオブジェクトはすべてCOM化してると考えればOK

camputer
質問者

お礼

 phoenix343様 ご回答どうもありがとうございます!  色々と調べております. 以前エラーで「Reintrancyが検出されました~」というのが多発して困った際に, 毎回Nextの前で解放するとうまくいき始めたのがきっかけでこのようにしております.  どうもすみません.OSの環境を明記しておりませんでした. 今うまく解放したい動作環境がVista+PPT2007になりますが, 今日別のPC(Win2000+Office2000)で試してみたところ,何故か解放されました. OSの影響かOfficeのバージョンなのか分かりませんでしたが...  もし何か些細なことでもご指摘・アドバイスいただけることがございましたら, 是非ともよろしくお願いいたします.

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

PowerPointは持ってないので憶測ですけど。 追加行のNextの前にあるmyS = Nothingは要りません。 要るとしたらNextの後でしょう。 あと追加行で指定してるMRComObjectの引数とNextの後で指定してる引数が気になります。同じオブジェクトの型では無いのはお分かりですよね?

camputer
質問者

補足

 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で同じことを試みると,上のコードで共通使用して解放できたので, 今回もこれを前オブジェクト共通で使用しております.意味分からず使用しておりますが..  もし何かお気づきになること等ございましたら, 是非ともアドバイスをよろしくお願いいたします.  

関連するQ&A