IHTMLDOMNode :: appendChid()不会一直按预期工作

时间:2015-06-25 09:51:25

标签: javascript internet-explorer com code-injection bho

我正在用C ++写一个BHO,基本上涉及两个阶段。

阶段1:从BHO打开新窗口并将其导航到网站URL(来自BHO),一旦DISPID_DOCUMENTCOMPLETE事件触发相应的URL,就将一些Javascript代码注入其文档,然后从js调用一些代码。然后,js引擎将处理更多代码,最后通过window.location.href将其窗口指向其他URL。

阶段2:一旦DISPID_DOCUMENTCOMPLETE在BHO内部为新URL触发,流程就会走同一条路线:注入脚本等。这就是我遇到麻烦的地方。

  1. 在Win 7 32位+ IE11上发生,在Win XP 32位+ IE8上不会发生
  2. 问题出现在第2阶段 - 注射失败。我试图在第一个body标签和第一个head标签上添加相同的结果。
  3. 对所有涉及的HRESULT返回值进行了测试,并且还返回了返回的接口指针的有效性,并且它们都通过了
  4. 但是,当从脚本调用函数时,GetIDsOfNames()在从javascript代码传递函数名称时返回-2147352570(未知名称)的hresult。
  5. 在IE中检查DOM显示未注入js代码
  6. 这种情况总是在启动IE时发生,然后不再发生鼠标点击或键盘事件。然而,只有大约5%或更少的情况发生IE并且发生点击(任何地方 - 桌面,标题栏,任何窗口的客户区域)。
  7. 尝试解决此问题:使用SendInput()以模拟鼠标单击。如上所述在第6点工作。使用在第二个URL DISPID_DOCUMENTCOMPLETE事件上触发的计时器,并在几秒钟后继续注入 - 当IHTMLDocument2 :: createElement()被调用时崩溃浏览器。

    这种奇怪的行为有什么理由,也许还有办法解决这个问题? 谢谢!

1 个答案:

答案 0 :(得分:1)

看起来我必须更新IWebbrowser2实例 - 它会在页面导航时更改。通过查询与DISPID_DOCUMENTCOMPLETE事件一起发送的第二个参数来获取新的接口指针。

链接到它:https://msdn.microsoft.com/en-us/library/aa768282%28v=vs.85%29.aspx