tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。