首页 > 解决方案 > IE 的区域海拔保护干扰 BHO 的功能

问题描述

我正在为用 C# 编写的 Internet Explorer 开发浏览器帮助程序对象 (BHO)。我使用该BeforeNavigate事件来获取调用的 URL 并将其保存到局部变量中。对于每个选项卡,都会生成一个新的 BHO 实例。这意味着每个选项卡都有自己的 BHO,而 BHO 又拥有自己的局部变量。在被新的 URL 覆盖之前,我通过显示带有先前调用的 URL(局部变量的值)的 MessageBox 来检查这一点。

string myUrl = "";

void BeforeNavigate( string URL, ... )
{
    System.Windows.Forms.MessageBox.Show( myUrl );
    myUrl = URL.ToString();
}

但在某些情况下,尽管之前调用了 URL,但局部变量为空。我调查了 IE 设置,发现这种行为是由 IE 的区域提升保护引起的。区域local intranet和保护模式被禁用,而区域和trusted sites保护模式被启用。internetrestricted sites

例如,当intranet.com被调用,然后internet.com在同一个选项卡中,我希望 MessageBoxintranet.cominternet.com被调用时显示。但是会显示一个空字符串。我猜想调用会internet.com激活此选项卡的保护模式,从而生成 BHO 的新实例。MessageBox 现在将显示新 BHO 实例的变量值。旧 BHO 的变量值丢失。

如果为区域启用了保护模式local intranet并且trusted sitesBHO 行为正确。我猜出于兼容性原因,在此区域中禁用了保护模式。内网中可能存在不支持保护模式的网站。因此,我正在寻找一种解决方案,该解决方案可以在此区域禁用保护模式的情况下工作。

由于 IE 管理 BHO 的加载,我怀疑这个问题是否可以从 BHO 内部解决。

有没有人对这个话题有更深入的了解来证实我的猜测?

local intranet是否可以在为区域和禁用保护模式的情况下保持变量的值trusted sites

任何帮助将不胜感激,谢谢!

标签: c#internet-explorerbho

解决方案


我找到了以下链接:http: //jimevansmusic.blogspot.com/2012/08/youre-doing-it-wrong-protected-mode-and.html

有说:

当您通过例如从内部 Intranet 网站导航到 Internet 上的网站进入或退出保护模式时,IE 必须创建一个新进程,因为它无法更改现有进程的强制完整性控制级别。此外,在 IE 7 之后的版本中,跨越保护模式边界并不总是很明显,因为 IE 试图通过将新进程的浏览器窗口与已经打开的浏览器窗口无缝合并来呈现更好的用户体验。这种隐蔽的进程切换还意味着在保护模式边界交叉之前指向 IE 的 COM 对象的任何引用都将指向在边界交叉之后 IE 不再使用的对象。

基于此,我的猜测似乎是正确的。作为 IE 的 COM 对象的 BHO 不再使用,因此失去了它的价值。剩下的唯一解决方案是为所有区域启用或禁用保护模式。


推荐阅读