2011-09-30 9 views
7

私は彼らが説明することをしようとしていますthisControlling Download and Executionセクションの記事。私はその文脈でWeb Browser Controlが.NETのWebBrowserではないことを理解しています。WebBrowserコントロールによって呼び出されるIDispatch :: Invokeを実装します。

私がしようとしているのは、WebBrowserコントロールのダウンロードを制御することです。私はこれをたくさん探していて、常にcsEXWBに登録しています。これは、私が解読できない巨大なコードを持っています。

私がこれまで行って[ComVisible(true)]属性を使用して.NETのWebBrowserは、私の継承されたクラスCOMが見えるように継承されてきたもの、(csEXWBから取られた)私のクラスには、このメソッドを追加します。

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

そして、

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

それでは、私が望んでいることはoleControlはそれがない私のIdispatch_AmbiantDlControl_Invoke_Handlerメソッドを呼び出すことです:Browserは私の派生クラスのインスタンスであるこのコード行を呼び出します。私はどのように私のコードが欠けているのかは分かりませんが、oleControlは私のIdispatch_AmbiantDlControl_Invoke_Handlerメソッドを呼び出すオブジェクトを知っているはずです。

上記のリンク先の記事はit will call your IDispatch::Invokeです。 yourとはどういう意味ですか? oleControlはどのオブジェクトが私のIDispatchであると言いますか?私は何か意味があると思っています。

+0

あなたが近くない、ホストが必要とされるカスタマイズ。 WebBrowserの場合、WebBrowserSiteという名前の内部クラス。 IDispatch実装をオーバーライドすることは難しい問題です。管理コードのCLRによって実装されています。あなたがネイティブコードなしでこの作業をどのように行うことができるかを見るのは難しいです。 –

+0

さて、csEXWBはC#AFAIKで書かれています。 IDispatch実装をオーバーライドする方法を開始できる場所はどこですか? – Ahmet

+1

System.Windows.Forms.AmbientPropertiesクラスはシールされています。 csEXWBのようにラッパーを放棄する時間。 –

答えて

17

DLCONTROLフラグを変更できるカスタマイズされたWebブラウザーがあります。

これはサンプルコードです:

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"); 
    } 
} 

およびカスタマイズされたWebブラウザーコード:

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<int, PropertyInfo> _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<int, PropertyInfo>(); 
        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, 
} 
+0

ありがとうございました!これは実際に私が予想していたよりずっと簡単でした。私はまだこのコードをもう少し詳しく見る必要がありますが、私はそれをテストして、それはうまくいきました。 – Ahmet

関連する問題