利用TIdHttp控件下载文件和vista的兼容问题,高手进来看看
下载代码在98\2000\xp下都没有问题;
但在vista下不能完成下载,症状为接收到1次或2次数据包后(有时也能收到更多的数据,但都没有超过3秒)就再也接收不到数据(跟踪发现代码停在Windows的网络Select函数上)
代码使用过Delphi7和turboDelphi编译,并尝试了Indy9和Indy10都一样;
完整测试源代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls,IdHttp,IdComponent;
type
TForm1 = class(TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FHttpCli : TIdHttp;
FStream : TStream;
procedure HTTPWork(Sender: TObject; AWorkMode: TWorkMode;const AWorkCount: Integer);
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FStream :=TStringStream.Create('');
FHttpCli := TIdHttp.Create(nil);
self.FHttpCli.OnWork := self.HTTPWork;
end;
procedure TForm1.HTTPWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
self.ProgressBar1.Position:=AWorkCount;
self.ProgressBar1.Refresh;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
url :string;
begin
url:='http://p.blog.csdn.net/images/p_blog_csdn_net/housisong/280093/o_xinkong_big.jpg';
FHttpCli.Head(url);
FHttpCli.Request.ContentRangeStart := 0;
FHttpCli.Request.ContentRangeEnd := FHttpCli.Response.ContentLength;
self.ProgressBar1.Min:=0;
self.ProgressBar1.Max:=FHttpCli.Response.ContentLength;
FHttpCli.Get(url, self.FStream); //下载
end;
end.