1

我的 C++ 程序启动 Internet Explorer(它适用于 IE6 到 IE10)以在 Internet 上显示一些网页;我没有办法修改网页。该网页引用了一个 JavaScript 文件(使用<script>HTML 标记中的一个标签)——一个swfobject JavaScript 库的副本。我希望网页使用我提供的此文件的自定义副本。

我想出了两种可能的方法来解决这个问题

  1. 编写 Internet Explorer 连接的代理服务器;代理获取实际数据,然后重写 HTML,以便引用我自己的 swfobject 副本。不幸的是,这是一项相当多的工作,并且可能不适用于 https。我现在可以在不支持 https 的情况下生活。

  2. 为 Internet Explorer实现一个异步协议插件,拦截所有 http 请求。我知道 JavaScript 文件总是使用 http 检索,所以我可以拦截对 swfobject JavaScript 文件的访问并生成我自己的文件。唉,这似乎也是不可能的,微软支持页面解释说

    Internet Explorer 会忽略用 CLSID 以外的值覆盖 HKEY_CURRENT_ROOT\PROTOCOLS\Http 的幼稚尝试

    这听起来像用自定义协议处理程序挂钩“http”是行不通的;无论如何,如果存在现有的 http 协议处理程序,这种方法也会有问题。

有没有比这两种方法更好的方法来解决这个问题?

4

3 回答 3

3

根据您要求的复杂性,Fiddler可能是自定义代理的有用替代方案,因为它可以自动重写请求和响应,并且可以快速编写您想要的脚本。

它也适用于 HTTPS,因此该部分是“免费的”。

想让 Fiddler 根据您指定的规则自动重写请求和响应、添加或删除标头或标记/忽略会话?查看 FiddlerScript 食谱

这是食谱的链接

如果需要嵌入,也可以作为FiddlerCore嵌入。

正如@MSalters 在下面指出的那样,Fiddler 的可选 SSL 拦截是您在使用它之前应该考虑的权衡。它被记录在这里,我已经写了一个简短的总结,说明它在这个答案中是如何工作的。

于 2013-02-06T13:39:51.270 回答
2

只要记下一个想法,就可以在您自己的进程中挂钩 WinSock send() 和 recv() 函数。这是一种中间人。这个解决方案具有高度复杂性的缺点。

于 2013-02-06T13:49:14.870 回答
1

简单,只需翻译 URL即可。swfobject将URL更改为file://URL,指向您的副本。

(您实际上并没有启动 IExplorer.EXE,对吗?这不是您应该打开网页的方式。您可以使用 启动 URL ShellExecute,将浏览器选择权留给用户,或者将 IE 的核心 MSHTML 嵌入到您的自己的应用程序。Internet Explorer 不是 Windows 的一部分,并且可能不存在,例如在 Windows N 上。)

于 2013-02-06T15:34:07.687 回答