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

タイトル Re^6: Webbrowser.Documentから...
投稿日: 2005/10/20(Thu) 11:53
投稿者魔界の仮面弁士
> P.S.コードに(開放忘れ等の)間違いや,
DomDocument は、unmanaged な COM インターフェイスを返すようなので、
おそらくは、Marshal.ReleaseComObject が必要になるかと思います。

ただ、手元に .NET 2.0 の環境が無いのでチェックはできません。m(_ _)m
.NET 1.1 時代の知識を基にした机上デバッグなので、
あまり保証はできませんが、それでもよければ、多分――


Imports System.Runtime.InteropServices

>     Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, _
>             ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _
>             Handles WebBrowser1.DocumentCompleted
'>        Dim myDoc As HTMLDocument = Me.WebBrowser1.Document.DomDocument
          Dim myDoc As HTMLDocument
          Try
            myDoc = Me.WebBrowser1.Document.DomDocument
            Try
              Dim body As IHTMLDOMNode = myDoc.body
>             PrintNodeTree(body)
            Finally
              If Not body Is Nothing AndAlso Marshal.IsComObject(body) Then
                Marshal.ReleaseComObject(body)
              End If
            End Try
>           myDoc.close()
          Finally
           If Not myDoc Is Nothing AndAlso Marshal.IsComObject(myDoc) Then
             Marshal.ReleaseComObject(myDoc)
           End If
          End Try
>     End Sub
>
>     Private Sub PrintNodeTree(ByVal Node As IHTMLDOMNode)
         Dim childNodes As Object
         Try
           childNodes = Node.childNodes
'>         For Each cNode As IHTMLDOMNode In Node.childNodes
           For Each cNode As IHTMLDOMNode In childNodes
>            Debug.Print(Space(Idt) & "<" & cNode.nodeName & ">")
>            If Not cNode.nodeValue Is DBNull.Value Then
>              Debug.Print(Space(Idt) & cNode.nodeValue)
>            End If
>            If cNode.hasChildNodes Then
>              Idt += 4
>              PrintNodeTree(cNode)
>            End If
             '---> 一応書いてみましたが、この部分の必要性は不明……。
             If Not cNode Is Nothing AndAlso Marshal.IsComObject(cNode) Then
               Marshal.ReleaseComObject(cNode)
             End If
             '<---
>           Next
          Finally
            If Not childNodes Is Nothing AndAlso Marshal.IsComObject(childNodes) Then
              Marshal.ReleaseComObject(childNodes)
            End If
          End Try
>         Idt -= 4
>     End Sub
> End Class

――のような感じになるのでは、と予想しています。

# For Each 中での解放処理が必要かどうかを調べたのですが、わかりませんでした。
# もしかしたら不要かもしれませんし、あるいは IEnumerator の方を解放する必要が
# あるのかも知れませんが、現時点ではわかりません。m(_ _)m
# hhttp://www.divakk.co.jp/aoyagi/csharp_tips_vssenum.html

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

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