IE BHO DWebBrowserEvents2_Event.BeforeScriptExecute не имеет веб-браузера. Документ на странице Обновить - PullRequest
0 голосов
/ 19 июня 2020

Я пишу BHO для IE11. В BHO я представил несколько методов, использующих интерфейс IExtension, которые будут вызываться JavaScript. Код ниже


    IWebBrowser2 _webBrowser2;
    
    int IObjectWithSite.SetSite(object site)
    {
    try
    {
    _site = site;
    
        if (site != null)
        {
            var serviceProv = (IServiceProvider)_site;
            var guidIWebBrowserApp = Marshal.GenerateGuidForType(typeof(IWebBrowserApp));
            var guidIWebBrowser2 = Marshal.GenerateGuidForType(typeof(IWebBrowser2));
    
            IntPtr intPtr;
            serviceProv.QueryService(ref guidIWebBrowserApp, ref guidIWebBrowser2, out intPtr);
    
            _webBrowser2 = (IWebBrowser2)Marshal.GetObjectForIUnknown(intPtr);
    
            ((DWebBrowserEvents2_Event)_webBrowser2).BeforeScriptExecute += S2_BeforeScriptExecute;
        }
        else
        {
            ((DWebBrowserEvents2_Event)_webBrowser2).BeforeScriptExecute -= S2_BeforeScriptExecute;
            _webBrowser2 = null;
        }
    
        return 0;
    }
    
    private void S2_BeforeScriptExecute(object pDispWindow)
    {
        dynamic window = _webBrowser2.Document.parentWindow;
        IExpando windowEx = (IExpando)window;
        windowEx.AddProperty("myExtension");
        window.myExtension = this;
    }

В этом все работает нормально, за исключением того, что когда пользователь нажимает кнопку refre sh в IE, _webBrowser2.Document.parentWindow выдает исключение

System.NotSupportedException: Exception from HRESULT: 0x800A01B6
   at System.Dynamic.ComRuntimeHelpers.CheckThrowException(Int32 hresult, ExcepInfo& excepInfo, UInt32 argErr, String message)
   at CallSite.Target(Closure , CallSite , ComObject )
   at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
   at CallSite.Target(Closure , CallSite , ComObject )
   at CallSite.Target(Closure , CallSite , Object )
   at BHO.S2_BeforeScriptExecute(Object pDispWindow)

Также я пробовал экземпляр SHDocVw.WebBrowser вместо IWebBrowser2, но проблема все еще та же.

Так есть ли альтернатива этому или чему-то еще, что работает нормально?

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