IE和插件(基于.Net)的奇怪行为

本文关键字:Net 插件 基于 IE | 更新日期: 2023-09-27 17:56:26

我正在使用SpicIE框架和C# 4.0为Internet Explorer编写一个插件。我的插件执行以下操作:用户按下按钮(共享链接按钮),插件将打开具有特定 URL 的单独 IE 窗口。当我执行以下操作时:打开 3 个选项卡,从最后一个到第一个单击"共享链接",->选项卡 #3 和 #2 正常打开窗口。选项卡 #1 引发异常:

System.Runtime.InteropServices.COMException (0x80004005): 错误 HRESULT E_FAIL 已从对 COM 组件的调用返回。 在 SHDocVw.IWebBrowser2.get_Document() at BGPlugin.Entities.Bookmarklet.ExecuteLinkShareWindow() at BGPlugin.UserControls.LinkShareControl.btnAdd_Click(Object sender, EventArgs e) at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message&m, MouseButton button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message&m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message&m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

同样在调试中,我在上述异常之前从Visual Studio 2010中收到以下异常:

检测到断开连接的上下文。 上下文0x2fb4b0已断开连接。不会使用任何代理为 COM 组件上的请求提供服务。这可能会导致损坏或数据丢失。若要避免此问题,请确保所有上下文/单元都保持活动状态,直到应用程序完全使用表示位于其中的 COM 组件的 RuntimeCallableWrappers 完成。

我注意到一件非常神秘的事情:上述例外仅在以下情况下:

打开的选项卡数 - 失败选项卡的索引(从 1 开始,0 表示无)

--------3-----------------------1

--------4-----------------------0

--------5-----------------------2

--------6-----------------------3

--------7-----------------------0

--------8-----------------------5

--------9-----------------------8

--------10----------------------0

--------11----------------------0

--------12----------------------4

我使用以下代码打开新窗口:

Plugin.HostInstance.NewWindow(uri, windowName);

NewWindow(...) 方法在后台使用以下代码:

 try
        {
            object URL = url;
            object flags = System.Reflection.Missing.Value; //special "nothing" value
            object targetName = System.Reflection.Missing.Value; //special "nothing" value
            object postData = System.Reflection.Missing.Value; //special "nothing" value
            object headers = System.Reflection.Missing.Value; //special "nothing" value
            InternetExplorer ie = (InternetExplorer)new InternetExplorer();
            ie.AddressBar = false;
            ie.ToolBar = 0;
            ie.StatusBar = false;
            ie.Width = 480;
            ie.Height = 480;
            ie.Resizable = false;
            ie.Navigate2(ref URL, ref flags, ref targetName, ref postData, ref headers);
            ie.Visible = true;
        }
        catch (Exception ex)
        {
            TraceSink.TraceEvent(TraceEventType.Error, 0, "Exception in Host.NewWindow :" + ex);
        }

我尝试使用以下代码代替 NewWindow:

var psi = new ProcessStartInfo("iexplore", uri);
Process p = new Process();
p.StartInfo = psi;
p.Start();  

错误现在不是定期发生的,而是不时发生的。

请帮助我修复或克服此错误。

IE和插件(基于.Net)的奇怪行为

IE中的每个选项卡都在自己的线程上打开,并带有自己的BHO/工具栏等实例。在自己的进程中每启动 3 个或更多选项卡。因此,只使用一个静态的 Plugin.HostInstance 是完全不正确的。我的第一个解决方法是使用静态字典填充在文档完成,但是在访问浏览器文档属性时,我经常收到UnauthorizedAccessException,所以我想正确的模式是使用IObjectWithSite COM接口中的GetSite方法。