i社区用户: 密码:
搜索:
首页| 资讯| 信息化| 视频| 专题| 创业| 企业中心| 企业博客| 职场| 周报全文| 方案中心 |电子杂志
市场会展| Blog| i社区| 社区联盟| RSS| 直播 | 发行| wiki |i| 下载| 英才招聘|CIO文库
IT两会 | 互联网年会
产品中心| 笔记本|台式机| DIY|数码| 服务器|网络通信| 手机|软件|显示器|信息安全|存储|组网| 动漫
首页|文库|数据中心|方案中心|专家库|厂商黄页|供求招标| 责编电话:010-68130909-1053

使用Internet Explorer下载文件


北京2865信箱160分箱(100085)冉林仓
01-11-30 上午 11:36:00


在编程的时候,你可能需要在你的程序实现文件下载功能,事实上你可能象我一样对网络协议一无所知,而且你也不愿意从头开始学习网络协议。最好的解决方案是借助于IE提供的函数实现文件下载,这不需要你掌握任何网络知识。
从IE 3.0开始,Internet Explorer就提供了一个URLDownLoadToFile函数。顾名思义,这个函数能够实现文件的下载。而且它还能够实现超时放弃下载。
使用URLDownLoadToFile函数出奇的简单,仅仅需要一个URL地址、一个文件名和一个处理进度回调的接口对象。剩下的工作全部由IE 来完成。这个函数可以由任何应用程序调用,在下载期间,IE不会显示图形界面,所以调用者可以根据需要提供一个进度对话框,而提供一个进度指示对话框对用户来说非常容易。

这个函数的调用规范如下:
HRESULT URLDownloadToFile(
LPUNKNOWN pCaller,
LPCSTR szURL,
LPCSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB);
pCaller
仅当调用者是一个ActiveX对象才使用,对于一个非ActiveX对象的应用程序这个参数应该为NULL
szURL
为要下载的绝对URL 文件名,这个参数不能为空。
szFileName
包含创建的目标文件名
dwReserved
必须为零
lpfnCB
一个指向 IBindStatusCallback 接口的指针, IE通过它向你通知下载的进度。
利用URLDownloadToFile()下载文件可以分下面几个步骤:
1. 提供一个要下载的URL文件名。
2. 构造一个目标创建文件的完整路径含文件名。
3. 创建一个IbindStatusCallback派生类,编写OnProgress()重载函数。
4. 派生一个类对象的事例
5. 调用URLDownLoad 函数,由于这个函数调用是同步的,因此你最好在一个工作者线程中调用这个函数,
6. 在OnProgress函数中,提供任何你需要的进度指示信息和其它界面,函数返回值告诉IE是继续下载或者是放弃下载。.
使用IbindStatusCallback
IBindStatusCallback 回调接口共有8个方法,但是你只需关心OnProgress(). 其它方法只需返回 E_NOTIMPL.
OnProgress 实现的规范是:
HRESULT OnProgress(
ULONG ulProgress,
ULONG ulProgressMax,
ULONG ulStatusCode,
LPCWSTR szStatusText );
ulProgress
到目前为止已经下载的字节数。
ulProgressMax
要下载的文件大小,0表示大小未知,需要注意的是,这个值仅在OnProgress调用期间变化,所以你不能把它保存到一个静态变量中,你应该在每次调用时检查这个值。
ulStatusCode
状态标志,这个值可以为下列一些值:
BINDSTATUS_BEGINDOWNLOADCOMPONENTS,
BINDSTATUS_INSTALLINGCOMPONENTS,
BINDSTATUS_ENDDOWNLOADCOMPONENTS.
szStatusText
图形界面中使用的字符串,由IE 提供,这个变量可能为NULL,在使用前应该检查这个变量。
OnProgress() 返回 S_OK 告诉IE 要继续下载, E_ABORT 则表示放弃下载
通过上面的简单介绍我们可以看出,使用这个函数还是比较罗嗦的,特别是提供回调接口显得特别罗嗦。
为了使用这个函数更为简单,我把它封装到一个COM组件中,这个组件封装了一个CdownLoad类,它继承了IbindStatusCallback接口,并提供了OnProgress()函数的实现,这个只有一个DownLoad()方法,且没有任何参数,使用起来更为简单。
下面是各种语言调用的例子:
1. Visual C++
#include "stdafx.h"
#include "..\URLDownLoad\URLDownLoad.h"
#include "..\URLDownLoad\URLDownLoad_i.c"
HRESULT TestDownLoad() {
CComPtr spDownLoad;
if( SUCCEEDED(spDownLoad.CoCreateInstance(CLSID_DownLoad)) ) {
spDownLoad->DownLoad();
}
return S_OK;
}
int main(int argc, char* argv[])
{
CoInitialize(0);
TestDownLoad();
CoUninitialize();
return 0;
}
2. Visual C#
添加对DownLoad.dll组件库的引用。
private void button1_Click(object sender, System.EventArgs e)
{
DownLoad Down=new DownLoad();
Down.DownLoad ();
}
3. Visual Basic 。net
添加对DownLoad.dll组件库的引用。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim d As New URLDOWNLOADLib.DownLoad()
d.DownLoad()
End Sub
以上程序在Visual Studio 。net Beta 2环境下调试通过。

(网页编辑:风之翼
 
频道全文检索
相关文章
调查显示:台湾和加拿大青少年嗜好网上下载音乐
提供手机铃声下载小心成被告

关于我们 | 客服热线 | 广告服务 | 招聘信息 | 法律声明 | 投稿指南 | 联系方式 
Copyright(C) ccw.com.cn,All rights reserved
中国计算机世界出版服务公司内容版权所有
京ICP证010182