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);
Then in 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第二个似乎在一秒钟后消失了。
您所看到的被称为虚拟制表符,在文档中只简要地提到过。直到最近我们联系了微软技术支持后才意识到这一点——但这些确实是症状(许多"幽灵"导航循环到大约:空白)。
如果您想检测它们(很可能是忽略它们),建议的半官方方法是-
- 获取IWebBrowser2接口,
- 从其中提取HWND,
- 使用IsWindowVisible检查HWND可见性。如果它不可见-它是一个虚拟选项卡。
相关文章:
- 一次加载整个缓存行以避免争用其中的多个元素
- 窗口如何处理加载两个不同版本的 DLL
- 加载图像约500次后,此错误显示在Visual Studio Qimage:不记忆,返回空图像
- ATL ActiveX DLL 作为映射类型图像和数据加载了两次
- 加载具有相同符号的两个共享库时是否存在符号冲突
- 如何使用布尔值来防止在一个类中加载两次
- 如何独立多次加载共享对象
- 将两个图像堆栈的非电源加载到 3D 纹理 OpenGL C++
- 虽然我只做过一次LoadLibrary,但我必须做两次FreeLibrary.此外,在卸载DLL后,当试图再次加载它时,
- 从具有两列的文件中加载二维阵列
- 在 Vulkan 中加载非二次幂纹理
- QWebPage在第一次加载后不起作用
- 如果静态和动态加载了libcrypto,则两次加载的动态/共享库/RSA_check_key将失败
- 第一次计算,第二次加载
- OpenCV便宜的立体相机无法一次加载两个流
- 多次加载属性树xml解析器异常
- IE BHO为每个标签加载两次
- 一次加载大块 csv 而不是使用 getline 的方法
- libcurl是否一次加载完整的页面?
- Linux共享库加载两次