【发布时间】:2015-11-09 13:25:53
【问题描述】:
我不是最擅长使用 COM 对象,但我需要扩展 WebBrowser 控件以支持导航方法中的标志(特别是为了防止从缓存读取/写入)。
根据我收集到的信息,我需要在某种程度上实现 IWebBrowser2。我可以只实现 Navigate 方法还是需要在接口中定义所有方法?
我发现了一些附加/分离事件接收器以扩展 Web 浏览器事件的示例,但在实际方法周围却很少。
我可以使用 WebBrowser 控件的底层 ActiveXInstance 吗?如果我创建一个实现 IWebBrowser2::Navigate 的类,并将一个变量转换为该类,分配 WebBrowser 控件 ActiveXInstance 然后尝试导航我得到一个 COM 异常 HRESULT E_FAIL
我发现了这个,但不确定底层控件是否仍然是 ShDocVw,因为我没有在我的 COM 对象中看到它(Target 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);
}
【问题讨论】:
-
没有。没有什么是你不能用你的类中的一个简单的变量来解决的。在调用 Navigate 之前设置它,在 DocumentCompleted 事件处理程序中读回它。
-
我通过一些更改修复了它,我不确定规则,我应该更改我的问题还是将我的答案作为单独的回复发布?基本上,我必须更改转换,我使用的是 IWebBrowser2,但我需要将其转换为 ShDocVw.WebBrowser - 一旦完成,一切正常。我喜欢扩展方法的想法,我将进一步探索,但由于我已经有一个从 WebBrowser 继承的类,我认为它不太适合这里。