IE BHO DWebBrowserEvents2_Event.BeforeScriptExecute не имеет веб-браузера. Документ на странице Обновить

Я пишу 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;
    }

В этом все работает нормально, за исключением того, что когда пользователь нажимает кнопку обновления в 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, но проблема остается той же.

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


person Mr. Usama    schedule 19.06.2020    source источник
comment
Да, вы правы, он содержит свойство parentWindow, я забыл преобразовать Document в HTMLDocument, поэтому в моем образце свойство parentWindow не отображается. Я удалил свой предыдущий ответ. Поскольку я до сих пор не нашел настоящей причины, можете ли вы попробовать добавить условие if, чтобы проверить, является ли документ нулевым, прежде чем получить родительское окно. Вот так: if(webBrowser.Document != null) { dynamic window = (mshtml.HTMLDocument)webbrowser.Document).parentWindow;. Кроме того, вы можете попробовать использовать событие DocumentComplete вместо события BeforeScriptExecute.   -  person Zhi Lv    schedule 19.06.2020
comment
Я проверил с помощью отладки, Document не является нулевым, parentWindow.   -  person Mr. Usama    schedule 19.06.2020
comment
Также об использовании DocumentComplete: IE не запускает его при нажатии кнопки обновления.   -  person Mr. Usama    schedule 19.06.2020
comment
Пожалуйста, проверьте эту тему, если сайт не является нулевым, лучше добавить событие BeforeScriptExecute, затем, если сайт нулевой, удалить событие. вот такой код:if(site != null){ webBrowser = (IWebBrowser2)site;((DWebBrowserEvents2_Event)webBrowser).BeforeScriptExecute += S2_BeforeScriptExecute;} else { ((DWebBrowserEvents2_Event)webBrowser).BeforeScriptExecute -= S2_BeforeScriptExecute; webBrowser = null; }   -  person Zhi Lv    schedule 22.06.2020
comment
Я делаю то же, что вы предложили, также я перешел по указанной вами ссылке, но проблема все еще существует.   -  person Mr. Usama    schedule 25.06.2020