从网络中下载一个指定文件(如果能用再加50) (50分)

  • 主题发起人 主题发起人 lhl20000
  • 开始时间 开始时间
L

lhl20000

Unregistered / Unconfirmed
GUEST, unregistred user!
原代码:
可以实现下载网络中的文件,但是如果网络忙文件下载慢,
机器好象死机一样,难以判断状态。(其实没死机)

我想得到下载的进度,这样就可以慢慢的等待,直到下载完毕。
或者停止下载。

有关资料说:
UrlDownloadToFile()函数的
最后一个参数可以传入一个IBindStatusCallback的实现,
以跟踪下载进度或控制中止下载。

我不明白应该怎样做,希望高手指教,请详细点说明,谢谢。

uses
URLMon, ShellApi;

function DownloadFile(SourceFile, DestFile: string): Boolean;

begin

try

Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;

except

Result := False;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

const

// URL Location

SourceFile = 'http://www.google.com/intl/de/images/home_title.gif';

// Where to save the file

DestFile = 'c:image.gif';

begin

if DownloadFile(SourceFile, DestFile) then

begin

ShowMessage('Download succesful!');

// Show downloaded image in your browser

ShellExecute(Application.Handle, PChar('open'), PChar(DestFile),

PChar(''), nil, SW_NORMAL)

end

else

ShowMessage('Error while downloading ' + SourceFile)

end;



 
// 司马华鹏

frmUpdate = class(TForm,IBindStatusCallback)
ImgTop: TImage;
LblTop: TLabel;
SpdBtnClose: TSpeedButton;
Bevel1: TBevel;
plStatus: TPanel;
plInfo: TPanel;
btnCancel: TFlatSpeedButton;
tmrUdapte: TTimer;
plProgress: TPanel;
procedure tmrUdapteTimer(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure ImgTopMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure SpdBtnCloseClick(Sender: TObject);
private
function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
function GetPriority(out nPriority): HResult; stdcall;
function OnLowResource(reserved: DWORD): HResult; stdcall;
function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;szStatusText: LPCWSTR): HResult; stdcall;
function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;stgmed: PStgMedium): HResult; stdcall;
function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
function GetHTMLFile(URL, FileName: string): HRESULT;
public
{ Public declarations }
end;

//------------------------------------------------------------------------------
function TfrmUpdate.GetHTMLFile( URL , FileName : string) : HRESULT;
var
status : IBindStatusCallback ;
begin
status := IBindStatusCallback(self);
result := UrlDownLoadToFile(nil, pChar( URL ) ,pChar( FileName ),0 ,Status );
end;

//------------------------------------------------------------------------------
function TfrmUpdate.GetBindInfo(out grfBINDF: DWORD;
var bindinfo: TBindInfo): HResult;
begin
result := E_NOTIMPL;
end;

//------------------------------------------------------------------------------
function TfrmUpdate.GetPriority(out nPriority): HResult;
begin
result := E_NOTIMPL;
end;

//------------------------------------------------------------------------------
function TfrmUpdate.OnDataAvailable(grfBSCF, dwSize: DWORD;
formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
begin
result := E_NOTIMPL;
end;

//------------------------------------------------------------------------------
function TfrmUpdate.OnLowResource(reserved: DWORD): HResult;
begin
result := E_NOTIMPL;
end;

//------------------------------------------------------------------------------
function TfrmUpdate.OnObjectAvailable(const iid: TGUID;
punk: IInterface): HResult;
begin
result := E_NOTIMPL;
end;

//------------------------------------------------------------------------------
function TfrmUpdate.OnStartBinding(dwReserved: DWORD;
pib: IBinding): HResult;
begin
result := E_NOTIMPL;
end;

//------------------------------------------------------------------------------
function TfrmUpdate.OnStopBinding(hresult: HResult;
szError: LPCWSTR): HResult;
begin
result := E_NOTIMPL;
end;
 
能加入点说明吗?我是菜鸟谢谢了。
 
[:D],50分只能给这么多代码啊,哈哈
 
我可以再加50分
 
wininet函数或者是用indy很方便的
 
有例子吗?
我的EMAIL:
lhl19770714@yahoo.com.cn
 
已经很清楚了,呵呵,我给你玩笑的,0分的问题我只要知道也会帮助你的!
 
to 爱元元的哥哥:
能做到像AUTOUPGRADER的效果么?好像老是要弹出一个提示,问你是保存还是运行
程序…………
 
用wininet太简单了,3个函数就搞定
 
to :张无忌
用wininet太简单了,3个函数就搞定.
麻烦高手详细的说明一下,所谓“会者不难,难者不会。”
 
InternetOpen
internetOpenUrl
internetReadfile
//释放资源用InternetCloseHandle
 
张兄可知道
如何用winnet设置http代理下载

有解给分
 
to 爱元元的哥哥
你的代码缺点东西,如果有时间的话,就麻烦你写全吧,不过
不写也没关系,结束问题时我会给你加20分。

to 张无忌
我用你说的三个函数解决了这个问题,但是
用的是FTP服务器,需要输入用户名和密码,不太安全,
如果不用密码或者用HTTP直接下载,同时出现进度的话,
那结果就好了。结束问题时我会给你加30分。
 
爱元元的哥哥
张无忌
得分
 
后退
顶部