IE BHO为每个标签加载了两次

时间:2014-05-27 18:47:43

标签: c# c++ internet-explorer bho

我正在使用此示例创建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)

2 个答案:

答案 0 :(得分:1)

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

我自己试图解决这个问题。

我目前正在考虑:

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

第二个似乎在一秒左右后消失。

答案 1 :(得分:0)

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

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

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