こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

 もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたくお願いいたします.
どうぞよろしくお願いします.

投稿日時 - 2009-05-30 14:47:32

QNo.5002663

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

#1です。
レスを見ましたが、ちゃんと理解してから使うようにしてください、、

このMRComObjectに渡しているなら、
MRComObject(myS)もNextの後にしないとだめでしょう。
だってmyS = Nothingと同じようなことしてるんですから。

「ReleaseComObject」で検索かけてみてください。
どういう処理なのかおぼろげながら分かるかなと思います。

※OfficeにあるオブジェクトはすべてCOM化してると考えればOK

投稿日時 - 2009-06-02 06:48:11

お礼

 phoenix343様
ご回答どうもありがとうございます!
 色々と調べております.
以前エラーで「Reintrancyが検出されました~」というのが多発して困った際に,
毎回Nextの前で解放するとうまくいき始めたのがきっかけでこのようにしております.

 どうもすみません.OSの環境を明記しておりませんでした.
今うまく解放したい動作環境がVista+PPT2007になりますが,
今日別のPC(Win2000+Office2000)で試してみたところ,何故か解放されました.
OSの影響かOfficeのバージョンなのか分かりませんでしたが...
 もし何か些細なことでもご指摘・アドバイスいただけることがございましたら,
是非ともよろしくお願いいたします.

投稿日時 - 2009-06-02 20:46:31

ANo.1

PowerPointは持ってないので憶測ですけど。

追加行のNextの前にあるmyS = Nothingは要りません。
要るとしたらNextの後でしょう。

あと追加行で指定してるMRComObjectの引数とNextの後で指定してる引数が気になります。同じオブジェクトの型では無いのはお分かりですよね?

投稿日時 - 2009-05-31 12:16:15

補足

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


 

投稿日時 - 2009-05-31 20:24:27

あなたにオススメの質問