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

时间:2011-05-13 15:49:57

标签: c# internet-explorer plugins

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

  

System.Runtime.InteropServices.COMException(0x80004005):错误HRESULT已从调用COM组件返回E_FAIL。   在SHDocVw.IWebBrowser2.get_Document()   在BGPlugin.Entities.Bookmarklet.ExecuteLinkShareWindow()   at BGPlugin.UserControls.LinkShareControl.btnAdd_Click(Object sender,EventArgs e)   在System.Windows.Forms.Control.OnClick(EventArgs e)   在System.Windows.Forms.Button.OnClick(EventArgs e)   在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)   在System.Windows.Forms.Control.WmMouseUp(消息& m,MouseButtons按钮,Int32点击)   在System.Windows.Forms.Control.WndProc(消息& m)   在System.Windows.Forms.ButtonBase.WndProc(消息& m)   在System.Windows.Forms.Button.WndProc(消息& m)   在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)   在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)   在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();  

错误现在不是经常发生,而是时不时发生。

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

1 个答案:

答案 0 :(得分:0)

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