タイトル | : 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の状態や種類にかかわらず開放される、 というものではないのでしょうか??? またコードの他の書き方についても、もし何かつっこんでいただけるところがございましたら、 勉強のきっかけにさせていただければと思いますのでアドバイスをいただけないでしょうか。 何卒よろしくお願いいたします。
|