我正在使用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();
错误现在不是经常发生,而是时不时发生。
请帮我修复或克服此错误。
答案 0 :(得分:0)
IE中的每个选项卡都在自己的线程上打开,并带有自己的BHO / Toolbar等实例。每个3个或更多选项卡都在自己的进程中启动。因此,仅使用一个静态Plugin.HostInstance是完全错误的。 我的第一个解决方法是使用静态字典填充OnDocumentComplete,但是在访问浏览器文档属性时我经常收到UnauthorizedAccessException,所以我想正确的模式是使用来自IObjectWithSite COM接口的GetSite方法。