VC中使用webbrowser,我想拦截下载对话框,程序指定默认下载路径,取出文件名,做过的帮忙看看啊,分不多,50分敬上,勿怪,先谢谢大家了

程序员小哈
嵌入式领域优质创作者
博客专家认证
2009-10-28 04:03:39
web浏览器控件,拦截弹出下载对话框怎么做啊?不让下载对话框弹出,我想把下载的内容保存到固定地方,用spy++查看句柄的方式关闭,就不要了,因为我还要得到被下载的文件名,我找了一下说用这个downloadmgr.h,但是不知道具体怎么实现,做过的说说呗,网上说要自定义下载管理器,我也没有思路,先谢谢大家了
...全文
1373 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sime507 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

http://blog.joycode.com/jiangsheng/archive/2007/07/03/104995.joy
和这里实现INewWindowManager的方法一样
[/Quote]

链接打不开。
ggask 2012-01-18
  • 打赏
  • 举报
回复
好麻烦啊
Gary@Tokyo 2010-04-06
  • 打赏
  • 举报
回复
这个先mark,现在正在做这块,有东西不懂
程序员小哈 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jiangsheng 的回复:]
VC6的话要用AfxEnableControlContainer注册一个自己的container
[/Quote]
谢谢jiangsheng(蒋晟)大哥,我按你的提示再试试^_^先道声谢谢
蒋晟 2009-11-03
  • 打赏
  • 举报
回复
VC6的话要用AfxEnableControlContainer注册一个自己的container
程序员小哈 2009-11-01
  • 打赏
  • 举报
回复
问题没有解决,先结贴了,谢谢jiangsheng(蒋晟)、tttyd(雪影)、ljz888666555(终于找到了)
程序员小哈 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jiangsheng 的回复:]
http://blog.joycode.com/jiangsheng/archive/2007/07/03/104995.joy
和这里实现INewWindowManager的方法一样
[/Quote]
蒋大哥VC6中没有 afxocc.h,我用VS2005中的又报了很多错误,第四天了,还是一点进展没有,郁闷了
程序员小哈 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jiangsheng 的回复:]
http://blog.joycode.com/jiangsheng/archive/2007/07/03/104995.joy
和这里实现INewWindowManager的方法一样
[/Quote]
谢谢蒋大哥的回复,我实在是太笨了,让你指点了好几回了还没弄弄明白,别人都是一点就透^_^,我先去看你的文章了,再有问题我还要麻烦你啊,不要闲烦啊^_^再次谢谢蒋大哥。

不好意思,先不能结贴,不然我没有分数可以问大家了,先见谅,问题一解决,我马上结贴^_^
蒋晟 2009-10-30
  • 打赏
  • 举报
回复
http://blog.joycode.com/jiangsheng/archive/2007/07/03/104995.joy
和这里实现INewWindowManager的方法一样
程序员小哈 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ljz888666555 的回复:]
jiangsheng(蒋晟)好像在USA时差估计该休息了。
[/Quote]
我说他怎么后半夜回复的答案呢,^_^朋友你知道怎么屏蔽下载对话框吗?我对ATL不熟悉
ljz888666555 2009-10-30
  • 打赏
  • 举报
回复

jiangsheng(蒋晟)好像在USA时差估计该休息了。
程序员小哈 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jiangsheng 的回复:]
只抓自己的程序的下载的话不用注册到全局的。在容器的IOleClientSite实现这里添加就行了
[/Quote]

jiangsheng(蒋晟)您好,希望您能看到我的帖子,我baidu、Google了关于IOleClientSite Webbrowser的内容,都没有找到解决方案,查到的内容都是代码段,我不清楚该在哪里实现,希望能够得到您的再次帮助,谢谢
程序员小哈 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jiangsheng 的回复:]
只抓自己的程序的下载的话不用注册到全局的。在容器的IOleClientSite实现这里添加就行了
[/Quote]
蒋晟大哥这么早就上线了啊,你一天可真辛苦,先致敬一下^_^
对,我不想注册全局的下载,跟迅雷,flashget不一样,我只要实现点击我的应用程序中的一个webbrowser中加载的一个站点--这个站点是我们自己的,我只是想把这个站点中的下载文件保存到一个固定目录,然后我还要取得这个文件,然后加载,IOleClientSite中可以实现我的要求吗?我是一个MFC的对话框程序,有可以参考的文档吗?谢谢
程序员小哈 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tttyd 的回复:]
另外你说的那个帖子里
In Download.h need to add at class declaration "public IDownloadManager" and COM_INTERFACE_ENTRY(IDownloadManager) in BEGIN_COM_MAP(CDownload) statement, Download.h should look like:

这里说的很清楚你需要实现IDownloadManager接口,按照6楼的方法使不能成功调用的。
[/Quote]
按照6楼的方法使不能成功调用的。tttyd您好,六楼说的要实现IDownloadManager接口,然后您又说不能成功调用,我有点糊涂了,六楼那种做法不对吗?还有一个问题是,IDownloadManager接口实现是写在一个单独的ATL中吗?如果是的话,那个下载器如何和我的应用程序连接上呢?我一方面是不想出现下载对话框,直接下载到程序指定的默认目录,一方面还要得到下载的文件名,不知道这两部分在哪实现?是ATL中还是我的应用程序中?麻烦您再指点一下,对ATL不太清楚,问的比较弱,请见谅
蒋晟 2009-10-29
  • 打赏
  • 举报
回复
只抓自己的程序的下载的话不用注册到全局的。在容器的IOleClientSite实现这里添加就行了
雪影 2009-10-29
  • 打赏
  • 举报
回复
另外你说的那个帖子里
In Download.h need to add at class declaration "public IDownloadManager" and COM_INTERFACE_ENTRY(IDownloadManager) in BEGIN_COM_MAP(CDownload) statement, Download.h should look like:

这里说的很清楚你需要实现IDownloadManager接口,按照6楼的方法使不能成功调用的。
雪影 2009-10-29
  • 打赏
  • 举报
回复
1. Under Visual Studio 2008 I've been added to headers path and libraries path installed headers and libraries
指的是你在http://www.microsoft.com/downloads/thankyou.aspx?familyId=64e66826-8427-450b-b90f-bd36b3cbb26f&displayLang=en下载的头文件和类库
程序员小哈 2009-10-29
  • 打赏
  • 举报
回复
1. Under Visual Studio 2008 I've been added to headers path and libraries path installed headers and libraries[/color[color=#0000FF]]<=这个是指的downloadmgr.h这个文件吗?
2. Created ATL project called "dwnldmngr", with Server type "Dynamic-link library (DLL)", with none additional options selected.

3. Than I added new "ATL Simple Object" class called Download, with such options:

Threading model - Apartment;
Aggregation - Yes;
Interface - Custom (with Automation compatible checked);
Support - ISupportErrorInfo checked, Connection points checked, IObjectWithSite (IE object support) checked.

4. Added lines to headers file as shown in article "code sample" and some of mine code for debug, so my Download.h looks like:

1 // Download.h : Declaration of the CDownload
2
3 #pragma once
4 #include "resource.h" // main symbols
5
6 #include "dwnldmngr_i.h"
7 #include "_IDownloadEvents_CP.h"
8 #include "downloadmgr.h"
9
10
11 #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
12 #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
13 #endif
14
15 // CDownload
16
17 class ATL_NO_VTABLE CDownload :
18 public CComObjectRootEx<CComSingleThreadModel>,
19 public CComCoClass<CDownload, &CLSID_Download>,
20 public ISupportErrorInfo,
21 public IConnectionPointContainerImpl<CDownload>,
22 public CProxy_IDownloadEvents<CDownload>,
23 public IObjectWithSiteImpl<CDownload>,
24 public IDownload
25 {
26 public:
27 CDownload()
28 {
29 // If object is created than show message box
30 MessageBox(NULL, (LPCWSTR)L"Object Created", (LPCWSTR)L"DLL Constructor",MB_OK);
31 }
32
33 DECLARE_REGISTRY_RESOURCEID(IDR_DOWNLOAD)
34
35
36 BEGIN_COM_MAP(CDownload)
37 COM_INTERFACE_ENTRY(IDownload)
38 COM_INTERFACE_ENTRY(ISupportErrorInfo)
39 COM_INTERFACE_ENTRY(IConnectionPointContainer)
40 COM_INTERFACE_ENTRY(IObjectWithSite)
41 END_COM_MAP()
42
43 BEGIN_CONNECTION_POINT_MAP(CDownload)
44 CONNECTION_POINT_ENTRY(__uuidof(_IDownloadEvents))
45 END_CONNECTION_POINT_MAP()
46
47 public:
48 // ISupportsErrorInfo
49 STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
50
51 STDMETHOD(Download)(IMoniker* pmk,
52 IBindCtx* pbc,
53 DWORD dwBindVerb,
54 LONG grfBINDF,
55 BINDINFO* pBindInfo,
56 LPCOLESTR pszHeaders,
57 LPCOLESTR pszRedir,
58 UINT uiCP );
59
60 DECLARE_PROTECT_FINAL_CONSTRUCT()
61
62 HRESULT FinalConstruct()
63 {
64 return S_OK;
65 }
66
67 void FinalRelease()
68 {
69 }
70
71 public:
72
73 };
74
75 OBJECT_ENTRY_AUTO(__uuidof(Download), CDownload)

5. Added lines to cpp file as shown in "code sample" with some customization to be compatible with Visual Studio 2008( (LPCWSTR)L casting), now my Download.cpp looks like:

1 // Download.cpp : Implementation of CDownload
2
3 #include "stdafx.h"
4 #include "Download.h"
5
6
7 // CDownload
8
9 STDMETHODIMP CDownload::InterfaceSupportsErrorInfo(REFIID riid)
10 {
11 static const IID* arr[] =
12 {
13 &IID_IDownload
14 };
15
16 for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
17 {
18 if (InlineIsEqualGUID(*arr[i],riid))
19 return S_OK;
20 }
21 return S_FALSE;
22 }
23
24
25 STDMETHODIMP CDownload::Download(IMoniker* pmk,
26 IBindCtx* pbc,
27 DWORD dwBindVerb,
28 LONG grfBINDF,
29 BINDINFO* pBindInfo,
30 LPCOLESTR pszHeaders,
31 LPCOLESTR pszRedir,
32 UINT uiCP )
33 {
34 :MessageBox(NULL, (LPCWSTR)L"Download", (LPCWSTR)L"Download Manager",MB_OK);
35 return S_OK;
36 }
37

6. To rgs I added some lines for registry automation, so My Download.rgs looks like:

1 HKCR
2 {
3 dwnldmngr.Download.1 = s 'Download Class'
4 {
5 CLSID = s '{9769B48C-CB8A-4AB3-B2D7-58938DB86F8D}'
6 }
7 dwnldmngr.Download = s 'Download Class'
8 {
9 CLSID = s '{9769B48C-CB8A-4AB3-B2D7-58938DB86F8D}'
10 CurVer = s 'dwnldmngr.Download.1'
11 }
12 NoRemove CLSID
13 {
14 ForceRemove {9769B48C-CB8A-4AB3-B2D7-58938DB86F8D} = s 'Download Class'
15 {
16 ProgID = s 'dwnldmngr.Download.1'
17 VersionIndependentProgID = s 'dwnldmngr.Download'
18 InprocServer32 = s '%MODULE%'
19 {
20 val ThreadingModel = s 'Apartment'
21 }
22 'TypeLib' = s '{03F6F1C9-29E6-4431-956D-E3F30ED0C572}'
23 }
24 }
25 }
26
27 HKLM
28 {
29 Software
30 {
31 Microsoft
32 {
33 'Internet Explorer'
34 {
35 val DownloadUI = s '{9769B48C-CB8A-4AB3-B2D7-58938DB86F8D}'
36 }
37 }
38 }
39 }

7. Everything is compiled successfully, I got my dwnldmngr.dll file in the Debug directory, register it using regsvr32(IE were closed), went to some download page and trying to download a file. First message box from class constructor were fired, and than started file download.


我把那篇文章的步骤贴出来了,方便各位查看,望得到指点
程序员小哈 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jiangsheng 的回复:]
http://msdn.microsoft.com/en-gb/library/aa753618(VS.85).aspx
[/Quote]
蒋晟大哥您好,很高兴一早上就能看到您的回复,你晚上休息那么晚呀?晚上三点还在回复帖子,敬佩,我这两天搜索相关内容的时候,看到了您很多关于webbrowser控件方面的回复,我知道您擅长这方面,本想发一个专家贴向您请教,可惜自己才72分,所以没有直接向您请教,今天看到你的回复我真的很高兴。
您发给我的连接,这两天我都看过了,自己对ATL接触的少,MSDN上得文章,我没有领悟如何操作,昨晚我找到这么一个帖子,
http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/22a0f2ee-5055-4591-911f-0765fdddb888
我看完,我的理解是,根据他的描述,建立一个ATL,然后,把生成的DLL注册一下,这样就可以指定自己下载器了,我理解的对吗?如果是对的,下面我还是有疑问,我如何能够得到下载内容的文件名呢?是在那个ATL中操作还是在我自己的程序中实现呢?如果说错的地方,请勿见笑^_^,希望能够得到你的再次回复,谢谢
蒋晟 2009-10-29
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-gb/library/aa753618(VS.85).aspx
加载更多回复(3)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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