IE的区域高程保护干扰BHO功能



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

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

但在某些情况下,局部变量为空,尽管之前调用了 URL。我调查了IE设置,发现此行为是由IE的区域提升保护引起的。对于local intranettrusted sites的区域,保护模式在为区域internetrestricted sites启用保护模式时处于禁用状态。

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

如果为区域local intranet启用了保护模式,并且trusted sitesBHO 的行为正确。我猜出于兼容性原因,保护模式在此区域中被禁用。内网中可能存在无法使用保护模式的网站。因此,我正在寻找一种适用于禁用此区域的保护模式的解决方案。

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

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

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

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

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

有说:

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

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