Vb.net 第一次加载后使用getElementById时出现异常0x800A01B6

Vb.net 第一次加载后使用getElementById时出现异常0x800A01B6,vb.net,getelementbyid,ribbon,Vb.net,Getelementbyid,Ribbon,我已使用visual studio XML功能区为Powerpoint创建了一个功能区。此功能区有一个按钮,简化后可执行以下操作: 打开IE浏览器 通过id搜索代码中的元素(hiddenfield) 获取此元素的值 打印实际幻灯片中的值 在我第一次单击功能区的按钮时,它工作正常,但在我单击按钮后,它会引发异常0x800A01B6 这是我单击按钮时执行的代码: Dim oType As Type = Type.GetTypeFromProgID("InternetExplorer.Applic

我已使用visual studio XML功能区为Powerpoint创建了一个功能区。此功能区有一个按钮,简化后可执行以下操作:

  • 打开IE浏览器
  • 通过id搜索代码中的元素(hiddenfield)
  • 获取此元素的值
  • 打印实际幻灯片中的值
在我第一次单击功能区的按钮时,它工作正常,但在我单击按钮后,它会引发异常0x800A01B6

这是我单击按钮时执行的代码:

Dim oType As Type = Type.GetTypeFromProgID("InternetExplorer.Application")
If oType IsNot Nothing Then
    Dim ie As SHDocVw.InternetExplorer
    ie = Nothing
    ie = TryCast(Activator.CreateInstance(oType), SHDocVw.InternetExplorer)

    If ie IsNot Nothing Then
        Dim oEmpty As Object = [String].Empty
        Dim oURL As Object = targetURL
        ie.AddressBar = False
        ie.MenuBar = False
        ie.ToolBar = 0
        ie.Visible = True
        ie.Height = 800
        ie.Width = 1100
        ie.Navigate(oURL, oEmpty, oEmpty, oEmpty, oEmpty)
    End If

    Do While (ie.Busy Or ie.ReadyState <> READYSTATE.READYSTATE_COMPLETE)
        Sleep(1000)
        Application.DoEvents()
    Loop

        Sleep(10000) ' 10 seconds for testing purpose

    Dim str As String = String.Empty
    Dim hdnstring As HTMLInputElement = ie.Document.getElementById("hdnstring")
    str = hdnstring.value

    DoSomething(str)

    ie.Quit()
    ie = Nothing
End If
异常为0x800A01B6消息

最奇怪的是,如果我在IE上下文菜单中单击viewsource,而延迟10秒(用于测试的延迟),那么每次单击按钮时,它都能正常工作;但如果我不这样做,就会出现异常0x800A01B6

知道我做错了什么吗

错误详细信息图像:


文档的类型仅在运行时解析,因此在此之前它是一个
对象。这就是为什么调用其中的任何方法都会导致所谓的后期绑定-您还不知道
getElementById
方法是否存在,因此必须在运行时确定

您很可能会出现错误,因为
文档
不是,这是唯一包含
getElementById
方法的文档类型

您可以尝试将
文档
强制转换为
IHTMLDocument3
界面。由于它继承了
IHTMLDocument
IHTMLDocument2
,因此即使文档实际上是早期类型之一,也可以在它们之间强制转换

DirectCast(ie.Document, IHTMLDocument3).getElementById("hdnstring")

在例外中有更多的文本吗?除了行号以外的任何其他文本例外?除了行号以外的任何其他文本以外的任何其他文本?只有行号以外的行号以外的任何其他文本例外?除了行号以外的任何其他文本以外的任何其他文本?除了行号以外的任何其他文本以外的任何其他文本?只有行号以外的任何其他文本的例外?只有行号以外的任何其他文本的例外?只有行号,它失败的行号的行号,它的行号,它失败的行号,它的行号的行号,它的行号除外的行号,它的行号,它的行号的行号,行号,行号,否则否则的行号,它的行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行号,行a̶i̶l̶s i添加了详细错误的屏幕截图欢迎使用堆栈溢出!
文档
属性的类型仅在运行时解析,因此在此之前它是一个
对象
(这就是为什么使用所谓的后期绑定,您不知道
getElementById
方法是否存在)。您可以尝试将
文档
强制转换为
IHTMLDocument3
对象,并查看其是否有效:
DirectCast(即,Document,IHTMLDocument3).getElementById(“hdnstring”)
。您也不应该调用
应用程序.DoEvents()
。相反,在这种情况下,使用。
Dim hdnstring As HTMLInputElement = ie.Document.getElementById("hdnstring")
DirectCast(ie.Document, IHTMLDocument3).getElementById("hdnstring")