【问题标题】:IHTMLDOMNode::appendChid() won't always work as expectedIHTMLDOMNode::appendChid() 不会总是按预期工作
【发布时间】:2015-09-11 20:32:12
【问题描述】:

我正在用 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 标记上都附加Child,结果相同。
  3. 对所涉及的所有 HRESULT 返回值以及返回的接口指针的有效性进行了测试,它们都通过了
  4. 但是,当需要从脚本调用函数时,GetIDsOfNames() 在从 javascript 代码中传递我的函数名称时会返回 -2147352570(未知名称)的 hresult。
  5. 在 IE 中检查 DOM 发现没有注入 js 代码
  6. 这总是在 IE 启动时发生,然后不再发生鼠标单击或键盘事件。但是,只有大约 5% 或更少的情况下会发生这种情况,即启动 IE 并发生点击(任何地方 - 桌面、标题栏、任何窗口的客户区)。

尝试解决这个问题:使用 SendInput() 来模拟鼠标点击。如上所述在第 6 点工作。使用在第二个 URL DISPID_DOCUMENTCOMPLETE 事件上触发的计时器并在几秒钟后继续注入 - 当调用 IHTMLDocument2::createElement() 时浏览器崩溃。

这种奇怪行为的任何原因以及解决方法? 谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 2019-01-03
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多