タイトル : Re^5: PowerPointのオブジェクト開放ができません 投稿日 : 2009/08/27(Thu) 19:56 投稿者 : camputer
Hongliang 様 どうもありがとうございます!下のコードでSlideもShapeも解放することができました!^^ mySlides = myPre.Slides Dim mySlidesNum As IEnumerator = mySlides.GetEnumerator() While mySlidesNum.MoveNext() Dim mySlide As Object = mySlidesNum.Current myShapes = mySlide.Shapes Dim myShapesNum As IEnumerator = myShapes.GetEnumerator() While myShapesNum.MoveNext() Dim myShape As Object = myShapesNum.Current MRComObject(myShape) End While Dim obj3 As Object = TryCast(myShapesNum, ICustomAdapter) Dim obj4 As Object = obj3.GetUnderlyingObject MRComObject(obj3) : obj3 = Nothing MRComObject(obj4) : obj4 = Nothing MRComObject(myShapesNum) : myShapesNum = Nothing MRComObject(myShapes) : myShapes = Nothing MRComObject(mySlide) End While Dim obj1 As Object = TryCast(mySlidesNum, ICustomAdapter) Dim obj2 As Object = obj1.GetUnderlyingObject MRComObject(obj1) : obj1 = Nothing MRComObject(obj2) : obj2 = Nothing MRComObject(mySlidesNum) : mySlidesNum = Nothing MRComObject(mySlides) : mySlides = Nothing 'MRComObject(mySlides) : mySlides = Nothing'←この行は必要でしょうか?? 勘違いしているかもしれないのですが,前のコメントで教えていただいた >・mySlides が追加で 1 つ >増えることになります。 については,MRComObject(mySlides) : mySlides = Nothingを2回やる必要があるのでしょうか? 上のコードでいろいろテストしておりますと,今回は一回やるだけで何故か解放できたのですが, そもそもReleaseComObject で解放する必要がある参照が増えているとわかっているのであれば, 今回の状況で解放できたからといって,むやみにコメントアウトしない方が いいのかな?などと考えております. また,以前Excelで同様に↓のようなコードを書いたときはExcel.EXEが残らなかったのですが, For Each mySheet In mySheets Next こちらについてもきちんと今回教えていただいたような書き直しておく方が無難でしょうか? 現在,チーム内の事務仕事を効率化するためのアプリを作成中でございますが, 他の人のPCで起動したときなどにエラーが出る可能性を懸念しております. 徹底的に解放されやすいコードにしておくものなのでしょうか??? (今回教えていただいたような事もそうでしたが,VBなどのオブジェクト思考Prog.は, 他の計算Prog.などと違い,裏でどのような動きをしているのかまったく見当がつきません...) 度々の質問で申しわけございませんが,今回Hongliang様に聞いておかないと, 今後ずっと間違った認識のままコーディングしそうです... お時間のある時に是非ともアドバイスいただきたくお願い申しあげます. どうぞよろしくお願いいたします. |