实现IDispatch ::调用由WebBrowser控件调用 [英] Implement IDispatch::Invoke to be called by a WebBrowser control
问题描述
我试图做什么,他们对<一个解释href=\"http://msdn.microsoft.com/en-us/library/aa770041%28VS.85%29.aspx#Controlling_Download_and_Execution\">this本文中的控制下载和执行
部分。据我所知, Web浏览器控件
在这方面是不是.NET的 web浏览器
。
I'm trying to do what they explain on this article in the Controlling Download and Execution
section. I understand the Web Browser Control
in that context is not .NET's WebBrowser
.
我试图做的是获取对什么 web浏览器
控制下载的控制。我一直在寻找这个有很多,总是连接起来的 csEXWB
,其中有一个巨大的code,我只是无法破译。
What I'm trying to do is to gain control over what the WebBrowser
control downloads. I've been searching for this a lot and always en up in the csEXWB
, which has a huge code that I just cannot decipher.
我到目前为止已经做的是继承.NET的 web浏览器
,让我的继承类的COM可见使用 [标记有ComVisible特性(真)]
属性,这种方法添加到我的班(从csEXWB拍摄):
What I've done so far is inherit .NET's WebBrowser
, make my inherited class com visible by using the [ComVisible(true)]
attribute, add this method to my class (taken from csEXWB):
[DispId(HTMLDispIDs.DISPID_AMBIENT_DLCONTROL)]
public int Idispatch_AmbiantDlControl_Invoke_Handler()
{
return (int)m_DLCtlFlags;
}
,然后调用该行code,其中浏览器
是我的派生类的一个实例:
And then call this line of code, where Browser
is an instance of my derived class:
IfacesEnumsStructsClasses.IOleControl oleControl = Browser.ActiveXInstance as IfacesEnumsStructsClasses.IOleControl;
oleControl.OnAmbientPropertyChange(IfacesEnumsStructsClasses.HTMLDispIDs.DISPID_AMBIENT_DLCONTROL);
那么,我希望的是, OLECONTROL
会打电话给我的 Idispatch_AmbiantDlControl_Invoke_Handler
方法,它不。我不知道怎么了,这也许正是我的code缺失,是 OLECONTROL
应该知道在哪个对象打电话给我 Idispatch_AmbiantDlControl_Invoke_Handler
方法。
So what I'm hoping is that the oleControl
will call my Idispatch_AmbiantDlControl_Invoke_Handler
method, which it doesn't. I don't know how, and this is probably what my code is missing, is the oleControl
supposed to know on which object to call my Idispatch_AmbiantDlControl_Invoke_Handler
method.
我上面链接的文章说的是它会调用你的IDispatch ::调用
。这是什么意思您
。我如何告诉 OLECONTROL
哪个对象是我的的IDispatch
。希望我做任何意义。
What the article I linked above says is it will call your IDispatch::Invoke
. What does it mean by your
. How do I tell oleControl
which object is my IDispatch
. Hope I'm making any sense.
推荐答案
下面是一个定制的web浏览器,允许你改变DLCONTROL标志。
Here is a customized WebBrowser that allows you to change the DLCONTROL flags.
这是一个例子code:
This is an example code:
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浏览器code:
And the customized WebBrowser code:
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,
}
这篇关于实现IDispatch ::调用由WebBrowser控件调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!