KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q238313: PRB:Accessing the Internet Explorer Document Object Model w/ VB

Article: Q238313
Product(s): Microsoft Visual Basic for Windows
Version(s): WINDOWS:4.0,5.0
Operating System(s): 
Keyword(s): kbfile kbVBp kbVBp400 kbVBp500 kbWebBrowser kbGrpDSVB kbDSupport
Last Modified: 11-JAN-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual Basic Standard Edition, 32-bit, for Windows, version 4.0 
- Microsoft Visual Basic Professional Edition, 32-bit, for Windows, version 4.0 
- Microsoft Visual Basic Enterprise Edition, 32-bit, for Windows, version 4.0 
- Microsoft Visual Basic Learning Edition for Windows, version 5.0 
- Microsoft Visual Basic Professional Edition for Windows, version 5.0 
- Microsoft Visual Basic Enterprise Edition for Windows, version 5.0 
-------------------------------------------------------------------------------

SYMPTOMS
========

In an article entitled "Accessing the Internet Explorer Document Object Model
From Visual Basic 5.0", provided with the July 1999 edition of the Microsoft
Developer Network (MSDN), Figure 4 includes sample code for "Inspecting Elements
in an HTML Document". When this code executes the following error may occur:

  Run-time error '13':
  Type mismatch

CAUSE
=====

The code sample does not correctly handle cases where frames exist on a Web
page.

RESOLUTION
==========

The following code replaces the code sample in Figure 4. It modifies the
RecurseFrames and FillTree procedures to correctly handle cases where frames
exist on a Web page:

  Option Explicit

  Private Sub cmdBack_Click()
     On Error Resume Next
     WebBrowser1.GoBack
  End Sub

  Private Sub cmdForward_Click()
     On Error Resume Next
     WebBrowser1.GoForward
  End Sub

  Private Sub cmdGo_Click()
     WebBrowser1.Navigate txtAddress
  End Sub

  Private Sub Form_Load()
     WebBrowser1.Navigate "http://www.microsoft.com"
  End Sub

  Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, _
     URL As Variant)

     On Error Resume Next
     If (pDisp Is WebBrowser1.object) Then
        ' DocumentComplete event is fired for each frame on a page
        ' this condition means that the main document is fully loaded
        ' and you can use brwWebBrowser.Document property

        txtAddress = WebBrowser1.LocationURL
        Me.Caption = WebBrowser1.LocationName
        txtText = ""
        tvTreeView.Nodes.Clear
        RecurseFrames WebBrowser1.Document, Nothing
     End If
  End Sub

  Private Sub RecurseFrames(ByVal iDoc As HTMLDocument, _
     ByVal iNode As Node)
     Dim I As Integer
     Dim Range As IHTMLTxtRange
     Dim Title As String
     Dim TextInfo As String
     Dim tvNode As Node

     On Error Resume Next

     Title = iDoc.Title
     If Title = "" Then
        Title = iDoc.parentWindow.Name
        If Title = "" Then Title = iDoc.location
     End If

     If iNode Is Nothing Then
        ' if this is the first time, add a root node
        Set tvNode = tvTreeView.Nodes.Add(, , , Title)
     Else
        Set tvNode = tvTreeView.Nodes.Add(iNode.Index, tvwChild, , Title)
     End If

     TextInfo = "Frame: " & Title & vbCrLf & "{" + vbCrLf
      
      ' check to see if the document has a BODY
     If iDoc.body.tagName = "BODY" Then
        ' fill the tree with following collections
        FillTree iDoc, "OBJECT", tvNode, "ActiveX Controls"
        FillTree iDoc, "A", tvNode, "Anchors"
        FillTree iDoc, "IMG", tvNode, "Images"
        FillTree iDoc, "", tvNode, "All"

        ' use the text range object to get text out of BODY
        Set Range = iDoc.body.createTextRange
        TextInfo = TextInfo & Range.Text & vbCrLf
        Set Range = Nothing
     ElseIf iDoc.frames.length > 0 Then
        ' fill the tree with each Frame in the
        ' collection and traverse each Frame
        For I = 0 To iDoc.frames.length - 1
           TextInfo = TextInfo & "FRAME: " & _
              iDoc.frames(I).Document.nameProp & vbCrLf
           Dim doc As New HTMLDocument
           Dim eCollection As IHTMLElementCollection
           Dim uElement As HTMLUnknownElement
           Set eCollection = iDoc.frames(I).Document.All
           For Each uElement In eCollection
              If uElement.tagName = "HTML" Then
                 doc.All(0).insertAdjacentHTML "BeforeBegin", _
                    uElement.innerHTML
                 doc.Title = "Frame: " & _
                    iDoc.frames(I).Document.nameProp
                 FillTree doc, "FRAME", tvNode, "FRAME"
                 RecurseFrames doc, tvNode
                 Set doc = Nothing
              End If
           Next uElement
        Next I
     End If

     txtText.Text = txtText.Text & TextInfo & "}" & vbCrLf

  End Sub

  Private Sub FillTree(iDoc As HTMLDocument, iMatchTag As String, _
    iNode As Node, iCategory As String)
     Dim Element As Object
     Dim Info As String
     Dim tvNode As Node
     Dim tvCatNode As Node

     On Error Resume Next

     Set tvCatNode = Nothing
     For Each Element In iDoc.All
        ' if the tag is the desired tag or all tags are desired
        If iMatchTag = "" Or Element.tagName = iMatchTag Then

           Info = Element.tagName & " "

           ' display information based on the tagName of the element
           If Element.tagName = "IMG" Then
              Info = Info & Element.href
           ElseIf Element.tagName = "A" Then
              Info = Info & Element.innerText & _
                          " (" & Element.href & ")"
           ElseIf Element.tagName = "INPUT" Then
              Info = Info & Element.Type
           ElseIf Element.tagName = "META" Then
              Info = Info & Element.nodeName
           ElseIf Element.tagName = "FRAMESET" Then
              Info = Info & Element.Name
           ElseIf Element.tagName = "FRAME" Then
              Info = Info & ": " & Element.src
           Else
              Info = Info & Element.Id
           End If

           If tvCatNode Is Nothing Then
              ' add the category node if its not there
              Set tvCatNode = tvTreeView.Nodes.Add(iNode.Index, _
                 tvwChild, , iCategory)
           End If
           Set tvNode = tvTreeView.Nodes.Add(tvCatNode.Index, _
                        tvwChild, , Info)
        End If
        If Element.tagName = "FRAME" Then
           ' traverse each Frame in the collection
           Dim I As Long
           For I = 0 To iDoc.frames.length - 1
              ' process the current Frame contents
              If iDoc.frames(I).Document.nameProp _
                = Element.Document.nameProp Then
                 Dim doc As New HTMLDocument
                 Dim eCollection As IHTMLElementCollection
                 Dim uElement As HTMLUnknownElement
                 Set eCollection = iDoc.frames(I).Document.All
                 For Each uElement In eCollection
                    If uElement.tagName = "HTML" Then
                       doc.All(0).insertAdjacentHTML "BeforeBegin", _
                          uElement.innerHTML
                       doc.Title = "Frame: " & _
                          iDoc.frames(I).Document.nameProp
                       RecurseFrames doc, tvNode
                       Set doc = Nothing
                    End If
                  Next uElement
              End If
           Next I
        End If
     Next
  End Sub

MORE INFORMATION
================

Use of the code included in this article is not supported. This sample is not
supported by Microsoft Corporation. It is provided "AS IS".

REFERENCES
==========

For more information about this topic, please see the article titled "Accessing
the Internet Explorer Document Object Model From Visual Basic 5.0" included in
the July 1999 edition of the Microsoft Developer Network (MSDN). For additional
information, please see the following article in the Microsoft Knowledge Base:

  Q162719 HOWTO: Use the WebBrowser Control from Visual Basic 5.0

Additional query words: vba

======================================================================
Keywords          : kbfile kbVBp kbVBp400 kbVBp500 kbWebBrowser kbGrpDSVB kbDSupport 
Technology        : kbVBSearch kbAudDeveloper kbZNotKeyword6 kbZNotKeyword2 kbVB500Search kbVBA500 kbVB500 kbVB400Search kbVB400
Version           : WINDOWS:4.0,5.0
Issue type        : kbprb

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.