Странное поведение IE и плагина (на основе .Net) - PullRequest
0 голосов
/ 13 мая 2011

Я пишу плагин для Internet Explorer, используя платформу SpicIE и C # 4.0.Мой плагин делает следующее: пользователь нажимает кнопку (кнопка «Поделиться ссылкой»), и плагин открывает отдельное окно IE с определенным URL.Когда я сделаю следующее: откройте 3 вкладки, от последней к первой нажмите «поделиться ссылкой», -> вкладки № 3 и № 2 откройте окно, как обычно.Вкладка # 1 выдает исключение:

System.Runtime.InteropServices.COMException (0x80004005): Ошибка HRESULT E_FAIL возвращена после вызова компонента COM.в SHDocVw.IWebBrowser2.get_Document () в BGPlugin.Entities.Bookmarklet.ExecuteLinkShareWindow () в BGPlugin.UserControls.LinkShareControl.btnAdd_Click (Отправитель объекта, EventArgs e) в System.Windows.Forgs.Color.Ens.Control.Cong.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 (Message & m) в System.Windows.Forms.ButtonBase.WndProc (Message & m) в System.Windows.Forms.Button.WndProc (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Сообщение & m) в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Также при отладке я получаю следующее исключение из Visual Studio 2010 перед предшествующим исключением:

ОтключениеКонтекст обнаружен.Контекст 0x2fb4b0 отключен.Прокси-сервер не будет использоваться для обслуживания запроса в компоненте COMЭто может привести к повреждению или потере данных.Чтобы избежать этой проблемы, убедитесь, что все контексты / апартаменты остаются живыми до тех пор, пока приложение не будет полностью завершено с RuntimeCallableWrappers, представляющими COM-компоненты, которые живут внутри них.

Я заметил очень загадочную вещь:исключение выше ocecers только в следующих случаях:

Количество открытых вкладок-Индекс неудачной вкладки (на основе 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);

NewWinВ методе dow (...) используется следующий код:

 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 голосов
/ 04 мая 2012

Каждая вкладка в IE открывается в собственном потоке с собственным экземпляром BHO / панели инструментов и т. Д. Каждые 3 или более вкладок запускаются в собственном процессе. Поэтому использование только одного статического Plugin.HostInstance совершенно неверно. Моим первым обходным решением было использование статического словаря, который был заполнен OnDocumentComplete, но я часто получал исключение UnauthorizedAccessException при доступе к свойствам документа браузера, поэтому я предполагаю, что правильный шаблон использует метод GetSite из COM-интерфейса IObjectWithSite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...