实现IDispatch :: Invoke由WebBrowser控件调用

我正在尝试在Controlling Download and Execution部分中Controlling Download and Execution他们在本文中解释的内容。 我理解该上下文中的Web Browser Control不是.NET的WebBrowser

我想要做的是控制WebBrowser控件下载的内容。 我一直在寻找这个并且总是在csEXWB ,它有一个巨大的代码,我无法破译。

到目前为止我所做的是inheritance.NET的WebBrowser ,通过使用[ComVisible(true)]属性使我的inheritance类com可见,将此方法添加到我的类(取自csEXWB):

  [DispId(HTMLDispIDs.DISPID_AMBIENT_DLCONTROL)] public int Idispatch_AmbiantDlControl_Invoke_Handler() { return (int)m_DLCtlFlags; } 

然后调用这行代码,其中Browser是我的派生类的一个实例:

 IfacesEnumsStructsClasses.IOleControl oleControl = Browser.ActiveXInstance as IfacesEnumsStructsClasses.IOleControl; oleControl.OnAmbientPropertyChange(IfacesEnumsStructsClasses.HTMLDispIDs.DISPID_AMBIENT_DLCONTROL); 

所以我希望oleControl将调用我的Idispatch_AmbiantDlControl_Invoke_Handler方法,而不是。 我不知道怎么样,这可能是我的代码丢失的原因,是oleControl应该知道调用我的Idispatch_AmbiantDlControl_Invoke_Handler方法的对象。

我上面链接的文章it will call your IDispatch::Invoke 。 你的意思是什么意思。 我如何告诉oleControl哪个对象是我的IDispatch 。 希望我有任何意义。

这是一个自定义的WebBrowser,允许您更改DLCONTROL标志。

这是一个示例代码:

 public partial class Form1 : Form { private MyWebBrowser _webBrowser; public Form1() { InitializeComponent(); _webBrowser = new MyWebBrowser(); _webBrowser.Dock = DockStyle.Fill; Controls.Add(_webBrowser); } private void button1_Click(object sender, EventArgs e) { _webBrowser.DownloadControlFlags = (int)WebBrowserDownloadControlFlags.DOWNLOADONLY; _webBrowser.Navigate("http://mysamplewebsite"); } } 

和自定义的WebBrowser代码:

 public class MyWebBrowser : WebBrowser { private const int DISPID_AMBIENT_DLCONTROL = -5512; private int _downloadControlFlags; // we want our site class, not the default one protected override WebBrowserSiteBase CreateWebBrowserSiteBase() { return new MyWebBrowserSite(this); } [DispId(DISPID_AMBIENT_DLCONTROL)] public int DownloadControlFlags { get { return _downloadControlFlags; } set { if (_downloadControlFlags == value) return; _downloadControlFlags = value; IOleControl ctl = (IOleControl)ActiveXInstance; ctl.OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL); } } protected class MyWebBrowserSite : WebBrowserSite, IReflect { private Dictionary _dispidCache; private MyWebBrowser _host; public MyWebBrowserSite(MyWebBrowser host) : base(host) { _host = host; } object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) { object ret = null; // Check direct IDispatch call using a dispid (see http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx) const string dispidToken = "[DISPID="; if (name.StartsWith(dispidToken)) { int dispid = int.Parse(name.Substring(dispidToken.Length, name.Length - dispidToken.Length - 1)); if (_dispidCache == null) { // WebBrowser has many properties, so we build a dispid cache on it _dispidCache = new Dictionary(); foreach (PropertyInfo pi in _host.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if ((!pi.CanRead) || (pi.GetIndexParameters().Length > 0)) continue; object[] atts = pi.GetCustomAttributes(typeof(DispIdAttribute), true); if ((atts != null) && (atts.Length > 0)) { DispIdAttribute da = (DispIdAttribute)atts[0]; _dispidCache[da.Value] = pi; } } } PropertyInfo property; if (_dispidCache.TryGetValue(dispid, out property)) { ret = property.GetValue(_host, null); } } return ret; } FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr) { return GetType().GetFields(bindingAttr); } MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr) { return GetType().GetMethods(bindingAttr); } PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr) { return GetType().GetProperties(bindingAttr); } FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr) { throw new NotImplementedException(); } MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr) { throw new NotImplementedException(); } MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr) { throw new NotImplementedException(); } MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr) { throw new NotImplementedException(); } MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) { throw new NotImplementedException(); } PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) { throw new NotImplementedException(); } PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr) { throw new NotImplementedException(); } Type IReflect.UnderlyingSystemType { get { throw new NotImplementedException(); } } } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B196B288-BAB4-101A-B69C-00AA00341D07")] internal interface IOleControl { void Reserved0(); void Reserved1(); void OnAmbientPropertyChange(int dispID); void Reserved2(); } } [Flags] public enum WebBrowserDownloadControlFlags: uint { DLIMAGES = 0x00000010, VIDEOS = 0x00000020, BGSOUNDS = 0x00000040, NO_SCRIPTS = 0x00000080, NO_JAVA = 0x00000100, NO_RUNACTIVEXCTLS = 0x00000200, NO_DLACTIVEXCTLS = 0x00000400, DOWNLOADONLY = 0x00000800, NO_FRAMEDOWNLOAD = 0x00001000, RESYNCHRONIZE = 0x00002000, PRAGMA_NO_CACHE = 0x00004000, NO_BEHAVIORS = 0x00008000, NO_METACHARSET = 0x00010000, URL_ENCODING_DISABLE_UTF8 = 0x00020000, URL_ENCODING_ENABLE_UTF8 = 0x00040000, NOFRAMES = 0x00080000, FORCEOFFLINE = 0x10000000, NO_CLIENTPULL = 0x20000000, SILENT = 0x40000000, OFFLINEIFNOTCONNECTED = 0x80000000, OFFLINE = OFFLINEIFNOTCONNECTED, }