| 在编程的时候,你可能需要在你的程序实现文件下载功能,事实上你可能象我一样对网络协议一无所知,而且你也不愿意从头开始学习网络协议。最好的解决方案是借助于IE提供的函数实现文件下载,这不需要你掌握任何网络知识。 |
|
从IE 3.0开始,Internet Explorer就提供了一个URLDownLoadToFile函数。顾名思义,这个函数能够实现文件的下载。而且它还能够实现超时放弃下载。 |
|
使用URLDownLoadToFile函数出奇的简单,仅仅需要一个URL地址、一个文件名和一个处理进度回调的接口对象。剩下的工作全部由IE 来完成。这个函数可以由任何应用程序调用,在下载期间,IE不会显示图形界面,所以调用者可以根据需要提供一个进度对话框,而提供一个进度指示对话框对用户来说非常容易。 |
|
HRESULT URLDownloadToFile( |
|
LPBINDSTATUSCALLBACK lpfnCB); |
|
仅当调用者是一个ActiveX对象才使用,对于一个非ActiveX对象的应用程序这个参数应该为NULL |
|
一个指向 IBindStatusCallback 接口的指针, IE通过它向你通知下载的进度。 |
|
利用URLDownloadToFile()下载文件可以分下面几个步骤: |
|
3. 创建一个IbindStatusCallback派生类,编写OnProgress()重载函数。 |
|
5. 调用URLDownLoad 函数,由于这个函数调用是同步的,因此你最好在一个工作者线程中调用这个函数, |
|
6. 在OnProgress函数中,提供任何你需要的进度指示信息和其它界面,函数返回值告诉IE是继续下载或者是放弃下载。. |
|
IBindStatusCallback 回调接口共有8个方法,但是你只需关心OnProgress(). 其它方法只需返回 E_NOTIMPL. |
|
要下载的文件大小,0表示大小未知,需要注意的是,这个值仅在OnProgress调用期间变化,所以你不能把它保存到一个静态变量中,你应该在每次调用时检查这个值。 |
|
BINDSTATUS_BEGINDOWNLOADCOMPONENTS, |
|
BINDSTATUS_INSTALLINGCOMPONENTS, |
|
BINDSTATUS_ENDDOWNLOADCOMPONENTS. |
|
图形界面中使用的字符串,由IE 提供,这个变量可能为NULL,在使用前应该检查这个变量。 |
|
OnProgress() 返回 S_OK 告诉IE 要继续下载, E_ABORT 则表示放弃下载 |
|
通过上面的简单介绍我们可以看出,使用这个函数还是比较罗嗦的,特别是提供回调接口显得特别罗嗦。 |
|
为了使用这个函数更为简单,我把它封装到一个COM组件中,这个组件封装了一个CdownLoad类,它继承了IbindStatusCallback接口,并提供了OnProgress()函数的实现,这个只有一个DownLoad()方法,且没有任何参数,使用起来更为简单。 |
|
#include "..\URLDownLoad\URLDownLoad.h" |
|
#include "..\URLDownLoad\URLDownLoad_i.c" |
|
if( SUCCEEDED(spDownLoad.CoCreateInstance(CLSID_DownLoad)) ) { |
|
int main(int argc, char* argv[]) |
|
private void button1_Click(object sender, System.EventArgs e) |
|
DownLoad Down=new DownLoad(); |
|
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click |
|
Dim d As New URLDOWNLOADLib.DownLoad() |
|
以上程序在Visual Studio 。net Beta 2环境下调试通过。 |
| |
|