我正在为用C#编写的Internet Explorer开发浏览器帮助器对象(BHO)。我使用BeforeNavigate
事件获取一个被调用的URL并将其保存到本地变量中。对于每个选项卡,都会产生一个新的BHO实例。这意味着每个选项卡都有其自己的BHO,而后者又具有自己的局部变量。我已经通过显示带有先前调用的URL(本地变量的值)的MessageBox来进行检查,然后再用新的URL覆盖它。
string myUrl = "";
void BeforeNavigate( string URL, ... )
{
System.Windows.Forms.MessageBox.Show( myUrl );
myUrl = URL.ToString();
}
但是在某些情况下,尽管之前调用了URL,但局部变量为空。我调查了IE设置,发现此现象是由IE的区域高程保护引起的。对于区域local intranet
和trusted sites
,在为区域internet
和restricted sites
启用保护模式时会被禁用。
例如,当调用intranet.com
并随后在同一选项卡中的internet.com
时,我希望在调用intranet.com
时MessageBox显示internet.com
。但是将显示一个空字符串。我猜调用internet.com
会激活此选项卡的保护模式,从而产生BHO的新实例。现在,MessageBox将显示新BHO实例的变量的值。旧的BHO变量的值丢失了。
如果为区域local intranet
和trusted sites
启用了保护模式,则BHO的行为正确。我想出于兼容性原因在此区域中禁用了保护模式。 Intranet中可能存在无法使用保护模式的网站。因此,我正在寻找一种在该区域禁用保护模式的解决方案。
由于IE管理BHO的加载,所以我怀疑能否从BHO内部解决此问题。
有人对此主题有更深入的了解以确认我的猜测吗?
是否可以在区域local intranet
和trusted sites
禁用保护模式的情况下保留变量的值?
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
我找到了以下链接: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不再使用,因此它的值丢失了。剩下的唯一解决方案是为所有区域启用或禁用保护模式。