【发布时间】: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 触发,流程就会按照相同的路线进行:注入脚本等。这就是我遇到麻烦的地方。
- 在 Win 7 32 位 + IE11 上发生,在 Win XP 32 位 + IE8 上不会发生
- 问题在于第 2 阶段 - 注入失败。我尝试在第一个 body 标记和第一个 head 标记上都附加Child,结果相同。
- 对所涉及的所有 HRESULT 返回值以及返回的接口指针的有效性进行了测试,它们都通过了
- 但是,当需要从脚本调用函数时,GetIDsOfNames() 在从 javascript 代码中传递我的函数名称时会返回 -2147352570(未知名称)的 hresult。
- 在 IE 中检查 DOM 发现没有注入 js 代码
- 这总是在 IE 启动时发生,然后不再发生鼠标单击或键盘事件。但是,只有大约 5% 或更少的情况下会发生这种情况,即启动 IE 并发生点击(任何地方 - 桌面、标题栏、任何窗口的客户区)。
尝试解决这个问题:使用 SendInput() 来模拟鼠标点击。如上所述在第 6 点工作。使用在第二个 URL DISPID_DOCUMENTCOMPLETE 事件上触发的计时器并在几秒钟后继续注入 - 当调用 IHTMLDocument2::createElement() 时浏览器崩溃。
这种奇怪行为的任何原因以及解决方法? 谢谢!
【问题讨论】:
标签: javascript internet-explorer com code-injection bho