所以我写了一个BHO,它公开了一个我从Javascript调用的函数。 我的目标系统是Windows 8 IE 10,但我得到的行为在Windows 7,8 32和64位,IE 10,IE 11上是相同的 - 这没关系,我认为它与系统无关。
所以如果你打开一个具有从BHO调用函数的JavaScript的页面,BHO工作正常 - 它被定义并且一切都很好。我有一个简单的本地页面来测试它调用BHO.method(),在线托管的同一页面也很棒。
但是在以下情况下它不起作用 - 我得到“错误:* property_added *未定义”。 1)如果您在新的附加选项卡中使用JS代码打开相同的测试页面。 (如果只是一个标签 - 它就像我上面描述的那样工作)。 2)如果您在第一个选项卡中打开任何其他页面,然后使用链接重定向(或只是在地址栏中粘贴相同的旧测试页面的URL) - “error:* property_added * is undefined”。
现在有趣的部分 - 我在DocumentComplete事件中添加了一个属性(让我们称之为)* property_added *。我把警报放在那里我可以看到DocumentComplete和AddProperty在所有正确的时间触发并运行,对于每个页面,但是在我描述的情况下,我在'dynamic window = browser.Document.parentWindow;'上得到了这个错误。 - 来自HRESULT的异常:0x800A01B6。请帮帮忙?
下面是我在OnDocumentComplete中使用的代码 - 虽然它很标准。
void OnDocumentComplete(object pDisp, ref object URL)
{
try
{
SHDocVw.IWebBrowser2 explorer = pDisp as SHDocVw.IWebBrowser2;
if (explorer != null)
{
dynamic window = explorer.Document.parentWindow;
IExpando windowEx = (IExpando)window;
PropertyInfo property = windowEx.GetProperty("BHO",BindingFlags.IgnoreCase); //BindingFlags.Default);
if (property == null)
{
property = windowEx.AddProperty("BHO");
}
property.SetValue(windowEx, this, null);
window.execScript("alert();");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
int IObjectWithSite.SetSite(object site)
{
this.site = site;
if (site != null)
{
browser = (InternetExplorer)site;
((DWebBrowserEvents2_Event)browser).DocumentComplete +=
new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
}
return 0;
}
更新:当我添加以下字符串
时window.execScript("alert('BHO is '+(typeof(BHO) == 'undefined' ? 'undefined' : 'defined'));");
在property.SetValue(windowEx, this, null);
之后的OnDocumentComplete中的- 重定向的页面案例突然开始正常工作。如果我删除这个字符串 - 它不起作用。这个世界怎么会有所作为?