第一次加载

时间:2017-03-14 17:20:55

标签: vb.net getelementbyid ribbon

我使用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

这是打开的网站代码(targetURL),代码在每次加载时保持相同,只有隐藏值发生变化:

<html>
<body>
    <form name="form1" id="form1">
        <input type="hidden" name="hdnstring" id="hdnstring" value="Get This String" />
    </form>
</body>
</html>

第二次(及以下)我执行该功能:IE打开,网站完全加载,等待10秒,然后我收到错误:

Dim hdnstring As HTMLInputElement = ie.Document.getElementById("hdnstring")

带有异常0x800A01B6消息。

最奇怪的是,如果我在IE上下文菜单中点击viewsource而延迟10秒(用于测试目的),每次点击按钮都会完美;但如果我不这样做,则异常0x800A01B6会出现。

知道我做错了什么?

错误详细信息图片:

screenshoot

1 个答案:

答案 0 :(得分:1)

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

您很可能会收到错误,因为Document不属于IHTMLDocument3 type,这是唯一包含getElementById方法的文档类型。

您可以尝试将Document转换为IHTMLDocument3界面。由于它继承了IHTMLDocumentIHTMLDocument2,即使文档实际上是早期类型之一,也可以在它们之间进行转换。

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