2011-09-30 12 views
7

द्वारा कॉल करने के लिए आमंत्रित करें, मैं Controlling Download and Execution अनुभाग में this आलेख पर जो कुछ समझाता हूं उसे करने की कोशिश कर रहा हूं। मैं समझता हूं कि Web Browser Control उस संदर्भ में .NET का WebBrowser नहीं है।आईडीआईस्पैच लागू करें :: वेबब्राउज़र नियंत्रण

मैं क्या करने की कोशिश कर रहा हूं WebBrowser नियंत्रण डाउनलोड पर नियंत्रण प्राप्त करना है। मैं इसे बहुत खोज रहा हूं और हमेशा csEXWB में हूं, जिसमें एक बड़ा कोड है जिसे मैं समझ नहीं सकता।

मैं अब तक क्या किया है के वारिस [ComVisible(true)] विशेषता का उपयोग करके नेट के WebBrowser, मेरी विरासत में मिला वर्ग कॉम दृश्यमान बनाने है, मेरी कक्षा के लिए इस विधि को जोड़ने (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 नामक एक आंतरिक वर्ग। आईडीस्पैच कार्यान्वयन को ओवरराइड करना मुश्किल समस्या है, इसे प्रबंधित कोड के लिए सीएलआर द्वारा कार्यान्वित किया जाता है। यह देखने में मुश्किल है कि आप मूल कोड के बिना यह काम कैसे कर सकते हैं। –

+0

खैर, csEXWB सी # AFAIK में लिखा गया है। क्या आप किसी भी जगह को जानते हैं जहां मैं आईडीस्पेच कार्यान्वयन को ओवरराइड करने के तरीके पर शुरू कर सकता हूं? – Ahmet

+1

कक्षा प्रणाली। Windows.Forms.AmbientProperties मुहरबंद है। सीएसईएक्सडब्ल्यूबी जैसे रैपर को त्यागने का समय था। –

उत्तर

17

यहां एक अनुकूलित वेब ब्राउजर है जो आपको 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<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

संबंधित मुद्दे