Я пишу 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, но проблема остается той же.
Так есть ли альтернатива этому или что-то еще, что работает нормально?
if(webBrowser.Document != null) { dynamic window = (mshtml.HTMLDocument)webbrowser.Document).parentWindow;
. Кроме того, вы можете попробовать использовать событие DocumentComplete вместо события BeforeScriptExecute. - person Zhi Lv   schedule 19.06.2020if(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