| | タイトル | : PowerPointのオブジェクト開放ができません |  | 記事No | : 9291 |  | 投稿日 | : 2009/08/26(Wed) 19:01 |  | 投稿者 | : camputer | 
  こんばんは。質問させていただきます。10年近く研究で計算プログラムを作成しておりましたが、1年ほど前にVB.NETに触れました。
 camputerと申します。どうぞよろしくお願いいたします。
 
 開発環境はVB.NET+XP+PPT2003になります。
 PPTで
 
 For Each Slide In Slides
 For Each Shape In Shapes
 
 Next
 Next
 
 ということをやりたいのですが、これら行のオブジェクト開放ができず、長い間悩んでおります。
 今までオブジェクト開放については、ほとんど花ちゃんで勉強させていただきましたので,
 何か修正のヒントをいただければと思い投稿させていただきました。よろしくお願いいたします。
 以下,作成したコードを載せさせていただきます.
 
 Dim myAPP As PowerPoint.Application
 myAPP = CreateObject("PowerPoint.Application")
 Dim myPre As PowerPoint.Presentation
 Dim myPres As PowerPoint.Presentations = myAPP.Presentations
 Dim mySlide As PowerPoint.Slide
 Dim mySlides As PowerPoint.Slides
 Dim myShape As PowerPoint.Shape
 Dim myShapes As PowerPoint.Shapes
 
 myPre = myPres.Open("C:\test\test.ppt", WithWindow:=MsoTriState.msoFalse)
 mySlides = myPre.Slides
 
 For Each mySlide In mySlides '←このFor〜Next文を無くせばPOWERPNT.EXEが消えます。
 MRComObject(mySlide) : mySlide = Nothing
 Next
 
 MRComObject(mySlides) : mySlides = Nothing
 myPre.Save() : myPre.Close()
 MRComObject(myPre) : myPre = Nothing
 MRComObject(myPres) : myPres = Nothing
 myAPP.Quit() : MRComObject(myAPP) : myAPP = Nothing
 
 
 
 色々と試しておりますと、
 Dim mySlide As PowerPoint.Slideを消して、
 For文の直前でDim mySlide As Object
 としてみると、たまにですが開放できるようになったのですが、
 同様の方法でFor Each myShape In myShapesを加えてみたところ、
 こちらも開放できませんでした。。。↓
 
 
 
 Dim myAPP As PowerPoint.Application
 myAPP = CreateObject("PowerPoint.Application")
 Dim myPre As PowerPoint.Presentation
 Dim myPres As PowerPoint.Presentations = myAPP.Presentations
 Dim mySlides As PowerPoint.Slides
 Dim myShapes As PowerPoint.Shapes
 
 myPre = myPres.Open(Mypath & FName, WithWindow:=MsoTriState.msoFalse)
 mySlides = myPre.Slides
 Dim mySlide As Object        '←この宣言方法にすると,
 For Each mySlide In mySlides '←このFor文の部分は解放されることが多くなったのですが...
 myShapes = mySlide.Shapes
 Dim myShape As Object
 
 For Each myShape In myShapes '←こちらが開放されません。このFor〜Next文を無くせばPOWERPNT.EXEが消えます。
 MRComObject(myShape) : myShape = Nothing
 Next
 MRComObject(myShape) : myShape = Nothing
 
 MRComObject(myShapes) : myShapes = Nothing
 MRComObject(mySlide) : mySlide = Nothing
 Next
 MRComObject(mySlides) : mySlides = Nothing
 myPre.Save() : myPre.Close()
 MRComObject(myPre) : myPre = Nothing
 MRComObject(myPres) : myPres = Nothing
 myAPP.Quit() : MRComObject(myAPP) : myAPP = Nothing
 
 
 MRComObjectについては、ずっと
 http://hanatyan.sakura.ne.jp/dotnet/Excel01.htmのコードを使わせていただいています。
 
 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
 
 
 3ヶ月以上前にhttp://virus.okwave.jp/qa5002663.htmlで質問させていただいたのですが、
 MRComObjectの位置を変えてみてもうまく開放できず、しばらくこの件で悩んでおります。
 (3ヶ月前にクローズしている質問なので重複質問にならないと思うのですが。。。。。)
 それと,たまにうまく開放される時があるのですが、POWERPNT.EXEやEXCEL.EXEの
 開放というのは、同じコードであれば、PCの状態や種類にかかわらず開放される、
 というものではないのでしょうか???
 またコードの他の書き方についても、もし何かつっこんでいただけるところがございましたら、
 勉強のきっかけにさせていただければと思いますのでアドバイスをいただけないでしょうか。
 何卒よろしくお願いいたします。
 
 |