繁体   English   中英

IE BHO为每个选项卡加载两次

[英]IE BHO loaded two times for each tab

我使用以下示例创建IE BHO: http : //code.msdn.microsoft.com/CSBrowserHelperObject-c5f3d2f6

我遇到的问题是每个选项卡BHO加载两次。 我在BHO构造函数中插入了以下核心:

        Trace.WriteLine("BHO.ctor");
        Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);

在析构函数中:

        Trace.WriteLine("BHO.destructor");
        Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);

然后在Setsite中:

        Trace.WriteLine("Bho.SetSite: " + site);
        Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);

在调试输出中启动IE时,我看到:

[3376] BHO.ctor 
[3376] Thread: 1 of process: 3376 
[3376] Bho.SetSite: System.__ComObject 
[3376] Thread: 1 of process: 3376 
[3376] BHO.ctor 
[3376] Thread: 3 of process: 3376 
[3376] Bho.SetSite: System.__ComObject 
[3376] Thread: 3 of process: 3376

而且只有当我关闭它时:

[3376] BHO.destructor 
[3376] Thread: 2 of process: 3376 
[3376] BHO.destructor 
[3376] Thread: 2 of process: 3376 

因此,两次加载BHO,并且同时存在两个BHO实例。 为什么会发生这种情况?

当我的BHO订阅了第三方大会的活动时,我发现了这个问题,并且遇到了一些奇怪的行为(因为该活动有1个以上的订阅者)。 首先,我认为是由第三方库引起的,但现在我从BHO中删除了所有多余的代码,因此它基本上什么也没做,但仍然加载了两次。

另外,如果在SetSite中添加OnDocumentComplete处理程序,然后在该处理程序中使用跟踪将URL写入调试控制台,则会看到第一个线程URL将是我页面的实际URL(例如www.google.com),第二个线程将是“有关:空白”。 另外,如果我再打开一个选项卡并在其中执行一些操作,然后切换到第一个选项卡,则会看到又创建了一个BHO实例(URL:about:blank)

这可能是IE的完整性级别管理。

我正在尝试自己解决这个问题。

我目前正在考虑:

http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/internet-explorer-automation-protected-mode-lcie-default-integrity-level-medium.aspx

第二个似乎在大约一秒钟后消失。

您所看到的称为虚拟标签, 仅在docs中简要提及 我们只是在联系MS支持人员之后才意识到这一点-但这些都是确切的症状(许多“幽灵”导航周期达到大约:空白)。

如果您想检测到它们(很可能会忽略),建议的半官方方法是-

  1. 获取IWebBrowser2接口,
  2. 从中提取HWND,
  3. 使用IsWindowVisible检查此HWND可见性。 如果不可见-这是一个虚拟选项卡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM