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.Application

我已使用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对象,并查看其是否有效:DirectCastie.Document、IHTMLDocument3.getElementByIdhdnstring。您也不应该调用Application.DoEvents。相反,在这种情况下,使用。
Dim hdnstring As HTMLInputElement = ie.Document.getElementById("hdnstring")
DirectCast(ie.Document, IHTMLDocument3).getElementById("hdnstring")