多个Internet Explorer版本在一个应用程序中并排显示

时间:2011-01-11 10:23:44

标签: c++ internet-explorer mfc

在我正在处理的MFC应用程序中,我需要显示一个Internet Explorer(我们正在使用组件CHtmlView),目前我们可以使用FEATURE_BROWSER_EMULATION更改IE工作的渲染模式注册表项。但是,这只允许我们更改应用程序中所有CHtmlView实例的呈现模式,再加上应用该更改,我们必须重新启动应用程序。
问题是,我们希望在我们的应用程序中并排显示多个版本的IE。我知道可以在一台计算机上获得多个IE版本,但我不确定如何将它们全部放在一台应用程序中。
我们有一些想法,如何解决这个问题,但它们并不是一个简单的解决方案,所以我想问你的想法。无论如何,这是我们提出的:

  1. 下载页面的源代码,添加document compatibility tag,将文档中的所有地址更改为绝对地址,并将此页面保存到磁盘。然后使用IE从光盘重新加载页面。此解决方案仅部分工作,因为虽然它使IE使用正确的呈现模式,但页面无法加载某些资源,因为它位于与原始位置不同的位置 - 我们更改的地址运行良好,但例如JavaScript生成的没有。而这个解决方案通常非常混乱,所以我们放弃了。

  2. 使用多个进程 - 每个IE版本都有自己的可执行文件/ dll库,我们在每个可执行文件上使用browser emulation feature,然后以某种方式将其粘贴到一个应用程序中(我承认,我不知道如何,因为我从未使用过Windows / MFC的多个进程)。但我不知道,如果这个解决方案能够奏效......

  3. 为我们的应用程序创建一个代理,它将以与解决方案1相似的方式更改下载的源代码 - 它将添加document compatibility tag,以强制IE进入所需的模式,但是它可以保持地址完好无损,因为IE会将源视为来自原始位置。在我看来,这个解决方案最安全,但与2解决方案一样,我不知道如何为我们的应用程序创建代理层,更重要的是,需要多长时间。

  4. 那么你有什么想法可以解决这个问题吗?如果解决方案使用CHtmlView之外的其他东西,那么就这样,我们总是可以改变它。 至于IE版本,我们希望,支持IE6会很不错,但是没有必要,所需的最低版本是IE7。

    感谢您的时间,任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

最后我用

解决了这个问题

我们自己的代理服务器(使用boost asio实现),并修改http请求/响应头以强制IE进入正确的兼容模式。

具有唯一名称的几个可执行文件,compatibility mode set in the registry。每个浏览器版本都在一个单独的过程中运行。

事实证明,代理服务器解决方案并不总是按预期工作。多进程解决方案确实按预期工作,但最终,模拟的浏览器并不总是像真正的浏览器那样工作,整个解决方案并非100%可靠。

我希望这将有助于将来。