WebBrowser实现IDownloadManager自定义下载管理的问题

jiezi316 2010-11-26 01:24:52
大体代码如下:
public partial class Form1 : Form, IServiceProvider//窗体继承了IServiceProvider接口

private void Form1_Load(object sender, EventArgs e)
{
IntPtr p;
object objBrowser = axWebBrowser1.GetOcx();
AxWebBrowser.IServiceProvider ispBrowser = objBrowser as AxWebBrowser.IServiceProvider;
int ip = ispBrowser.QueryService(ref InterfaceGuid.SID_SProfferService, ref InterfaceGuid.IID_IProfferService, out p);
IProfferService ips = Marshal.GetObjectForIUnknown(p) as IProfferService;
ips.ProfferService(ref InterfaceGuid.IID_IDownloadManager, this, ref m_DownloadManagerCookie);

string strURI = "http://im.qq.com/qq/2010/standard_sp2/";
axWebBrowser1.Navigate(strURI);

}

public int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject)//实现IServiceProvider接口的方法
{
int retVal = -1;
ppvObject = IntPtr.Zero;
if (guidService == InterfaceGuid.SID_SDownloadManager && riid == InterfaceGuid.IID_IDownloadManager)
{
IDownloadManager a = new DownloadManager(); //DownloadManager为实现了IDownloadManager接口的类
IntPtr pUnk = Marshal.GetIUnknownForObject(a);
retVal = Marshal.QueryInterface(pUnk, ref riid, out ppvObject);
Marshal.Release(pUnk);
}
return retVal;
}
因为DownloadManager类比较简单就是继承IDownloadManager接口,并实现了Download方法,这里就不贴代码了.

现在的问题是,点击下载可以触发QueryService的方法,但执行完QueryService里面的方法后,却不会触发DownloadManager类的Download方法,感觉哪里没有整对。但我自己又不太清楚,请大家帮我看看啊!谢谢了
...全文
558 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
YHW 2011-01-24
  • 打赏
  • 举报
回复
IE6以后QueryService不能用的,只能直接读注册表得到Idownloadmanager的CLSID
jiezi316 2010-11-26
  • 打赏
  • 举报
回复
我也看了很多jiangsheng回复的帖子,好像都是继承IUnKnown和IDownloadManager接口,实现1个COM组件。然后有2种方式来实现下载管理,1就是在应用程序中实现IServiceProvider接口。2就是在对应的注册表项添加键值,对应的键值为你实现的这个Com组件的ClsId。

给的VC的例子中也没有使用IProfferService接口。但我找了很多C#的资料,感觉和MFC中有些不一样。反正我是整不走了
jiezi316 2010-11-26
  • 打赏
  • 举报
回复
补充下
第一句话应该是
public partial class Form1 : Form, AxWebBrowser.IServiceProvider
//窗体继承了IServiceProvider接口
因为我这个接口的定义是放在AxWEbBrowser这个命名空间下的。小细节就不必细看了,因为我为了让大家方便看,有些地方处理了下,可能有点问题,主要是看我的思路对不对。

个人感觉就是在QueryService的实现部分由问题。因为MSDN的文档上写的是利用IDownloadManager接口实现1个COM组件,然后在QueryService里面利用Marshal.QueryInterface返回该组件的接口指针什么的。但我这里是实现的个类。不晓得可以不?

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧