Dai*_*tsu 13 windows delphi winapi download
谷歌搜索显示了一些关于如何在Delphi中下载文件的示例,但大多数都是错误的,有一半的时间根据我的经验不起作用.
我正在寻找一个简单的强大解决方案,让我下载一个exe(用于更新我的应用程序),并将保持当前更新线程的执行,直到下载完成或错误输出.该进程已经过线程化,因此下载代码应该执行直到完成(希望如此).
这里有两个实现,看起来都很复杂
1. http://www.scalabium.com/faq/dct0116.htm
2. http://delphi.about.com/od/internetintranet/a/get_file_net.htm
And*_*and 16
第二种方法是使用WinINet(Windows API的一部分)使用Internet资源的标准方法.我经常使用它,它一直很好用.我从未尝试过的第一种方法.(两者都不"非常复杂".使用Windows API时总会有一些额外的步骤.)
如果你想要一个非常简单的方法,你可以简单地调用UrlMon.URLDownloadToFile.关于下载,你不会得到任何精细控制(根本没有!),但它非常简单.
例:
URLDownloadToFile(nil,
'http://www.rejbrand.se',
PChar(ExtractFilePath(Application.ExeName) + 'download.htm'),
0,
nil);
Run Code Online (Sandbox Code Playgroud)
Mik*_*lor 16
为什么不利用indy.如果你使用TIdHTTP它很简单
procedure DownloadFile;
var
IdHTTP1: TIdHTTP;
Stream: TMemoryStream;
Url, FileName: String;
begin
Url := 'http://www.rejbrand.se';
Filename := 'download.htm';
IdHTTP1 := TIdHTTP.Create(Self);
Stream := TMemoryStream.Create;
try
IdHTTP1.Get(Url, Stream);
Stream.SaveToFile(FileName);
finally
Stream.Free;
IdHTTP1.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用OnWork和OnWorkBegin事件添加进度条
procedure IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64);
begin
ProgressBar.Max := AWorkCountMax;
ProgressBar.Position := 0;
end;
procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
ProgressBar.Position := AWorkCount;
end;
Run Code Online (Sandbox Code Playgroud)
我不确定这些事件是否会在主线程的上下文中触发,因此可能必须使用tidnotify组件对VCL组件进行任何更新以避免线程问题.也许别人可以检查一下.