我对COM对象不是最好的,但我需要扩展WebBrowser控件以支持导航方法中的标志(特别是为了防止从缓存中读取/写入)。
从我收集到的内容中,我需要在某种程度上实现IWebBrowser2。我可以只实现Navigate方法,还是需要在界面中定义所有方法?
我找到了一些附加/分离事件接收器以扩展Web浏览器事件的示例,但实际方法却很少。
我可以使用WebBrowser控件的下划线ActiveXInstance吗?如果我创建一个实现IWebBrowser2 :: Navigate的类,并将变量强制转换为该类,则分配WebBrowser控件ActiveXInstance然后尝试导航我得到一个COM异常HRESULT E_FAIL
我发现了这个,但不确定基础控件是否仍然是ShDocVw,因为我没有在我的COM对象中看到它(目标FW .Net 3.5):Web Browser to handle pop ups within the application
internal ShDocVw.WebBrowser ActiveXWebBrowser { get; private set; }`
new public void Navigate(string url)
{
this.Navigate(url, axNativeMethods.WebBrowserNavigateFlags.NoReadFromCache | axNativeMethods.WebBrowserNavigateFlags.NoWriteToCache, string.Empty, new byte[] { }, string.Empty);
}
public void Navigate(string url, axNativeMethods.WebBrowserNavigateFlags flags, string targetFrameName, byte[] postData, string headers)
{
this.ActiveXWebBrowser = (ShDocVw.WebBrowser)this.ActiveXInstance;`
object flagsObj = (flags == axNativeMethods.WebBrowserNavigateFlags.None) ? null : (object)flags;
object targetFrameNameObj = targetFrameName;
object headersObj = headers;
object postDataObj = postData;
ActiveXWebBrowser.Navigate(url, ref flagsObj, ref targetFrameNameObj, ref postDataObj, ref headersObj);
}
答案 0 :(得分:0)
这是extension methods的完美用例。基本上,它们允许您在静态类中定义出现的方法,以直接绑定到要扩展的类型,并且其行为与该类型上的公共实例方法非常相似,只有公共或内部(在友元程序集或扩展类和扩展类在同一程序集中的情况下可用。
以下是一个示例代码段:
public static class WebBrowserExtensions
{
public static void Navigate(this IWebBrowser2 browser, string url)
{
browser.Navigate(url, /* fill in arguments as necessary*/)
}
}