高分求解:DLL如何下载文件?(200分)

  • 主题发起人 主题发起人 soFTangeL
  • 开始时间 开始时间
S

soFTangeL

Unregistered / Unconfirmed
GUEST, unregistred user!
我要编写一个DLL文件,需要下载一些文件(比如http://www.test.com/text.rar),而且不应该出现一般的像IE那样的下载对话框,是在用户后台默默进行的。但这个DLL没有Form。因此不太容易放些控件。请问该怎么解决?
先送上200分。如果有Demo的话再另开新帖给分。谢谢各位大大了![:I][:I][:I]
 
需要一个EXE才能调用这个DLL里的函数,或者你把他塞到系统里去也是可以,不过要在
注册表里写东西,
 
在Dll中动态建立NMFTP控件,在利用NMFTP控件下载文件.[:)]
 
To 张无忌 兄:
不过我这个DLL是作为一个程序的插件而开发的。所以不大可能改动主EXE文件啦!还有没有其他的办法呢?
To lightstar 兄:
这个方法能具体说说么?或给一段Demo的代码?
还有这个控件能下载诸如“http://www.testsite.com/test/down.asp?id=181&no=2”动态链接的文件呢?
再次感谢两位的帮忙。还请继续解惑![:)]
 
那就动态创建控件,下载用wininet很 不错,写一个单独的线程也不错吗
 
能下载诸如 http://www.testsite.com/test/down.asp?id=181&no=2 这样的转向链接么?
 
最终我使用了ICS的HttpCli控件。在DLL中动态创建。(已引用HttpProt.pas单元)

我定义了这样一个类:
Type
TMyobject = Class(TObject)
Timer1: Ttimer;
HttpCli1: THttpCli;
Procedure UpFileList(Sender: TObject);
End;

Var
myobject: Tmyobject;
并在DLL装载的时候执行下面的代码:
myobject := tmyobject.Create();
myobject.timer1 := Ttimer.Create(Nil);
myobject.timer1.Interval := 10000;
myobject.timer1.Enabled := True;
myobject.timer1.OnTimer := myobject.UpFileList;
myobject.HttpCli1.Create(Nil);
最后释放DLL时进行
MyObject.HttpCli1.Free;
myobject.Timer1.Free;
myobject.Free;

但调用此DLL发生错误。已确定是HttpCli引发的错误(可以通过注释掉某些语句来判断)。我的疑问就是为什么Timer1不出错而HttpCli出错?两者的地位应该是相同的。创建、调用的方法也一样。但为什么Timer1不出错而偏偏HttpCli出错呢?[:(]
 
我以前用过 ICS,INDY,HTTPGET,以及用 WebBrowser 模拟的。。。
现在我用自己做的,最简洁,一个函数,不用装控件~~绝对好用

uses
WinInet;
//***********[ THttpRequest.Execute ]于2001-7-16创建***************************
function HttpRequestExecute(const URL, QureyData: string): string;
var
hSession, hConnect, hRequest: hInternet;
RequestMethod, TempStr, HostName, FileName: string;
BytesToRead : cardinal;
DataLength : integer;
AData : array[0..40960] of char;
InternetFlag : LongWord;
AcceptType : PAnsiChar;
Buf : array[0..1023] of char;
dwBufLen, dwIndex: LongWord;
procedure ParseURL(URL: string; var HostName, FileName: string);
var
i : Integer;
begin
if Pos('http://', URL) <> 0 then
System.Delete(URL, 1, 7);
i := Pos('/', URL);
HostName := Copy(URL, 1, i);
FileName := Copy(URL, i, Length(URL) - i + 1);
if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
SetLength(HostName, Length(HostName) - 1);
end;
procedure CloseHandles;
begin
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
end;
begin
result := '';
ParseURL(URL, HostName, FileName);
hSession := InternetOpen(PChar(''),
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
hConnect := InternetConnect(hSession, PChar(HostName),
INTERNET_DEFAULT_HTTP_PORT, '', '', INTERNET_SERVICE_HTTP, 0, 0);
if QureyData = '' then RequestMethod := 'GET'
else RequestMethod := 'POST';
InternetFlag := 0;
AcceptType := PChar('Accept: */*');
hRequest := HttpOpenRequest(hConnect, PChar(RequestMethod), PChar(FileName), 'HTTP/1.0',
'', @AcceptType, InternetFlag, 0);
if QureyData = '' then
HttpSendRequest(hRequest, nil, 0, nil, 0)
else
HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
PChar(QureyData), Length(QureyData));
BytesToRead := 0;
dwIndex := 0;
dwBufLen := sizeof(Buf);
HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, @Buf, dwBufLen, dwIndex);
DataLength := StrToIntDef(Buf, 0);
while InternetReadFile(hRequest, @AData, SizeOf(AData), BytesToRead) do
begin
if BytesToRead = 0 then break;
SetString(TempStr, AData, BytesToRead);
Result := Result + TempStr;
end;
CloseHandles;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s : TStringStream;
begin
ShowMessage( HttpRequestExecute('http://www.sina.com.cn/','')); //注意后面必须加'/'
s := TStringStream.Create(HttpRequestExecute('http://www.testsite.com/test/down.asp?id=181&no=2',''));
s.SavetoFile('c:/a.dat');
s.free;
end;
 
谢谢。我这就去试试。顺便问一句: function HttpRequestExecute(const URL, QureyData: string): string; 里面的 QureyData 和返回值都代表什么意思?
另外s.SavetoFile('c:/a.dat');这个执行不了。似乎 TStringStream没有SaveToFile这个方法吧?

 
URLDownloadToFile函数可以下载文件。
 
URLDownloadToFile函数我怎么没找到啊?在哪个单元啊?
 
从Adnil那里学来的:
不需要用socket,利用urlmon.dll就能完成
uses urlmon;

UrlDownloadToFile(nil, Pchar('http://www.aaa.com/info.txt'), Pchar('c:/info.txt'), 0, nil);
 
dirk:
你好,你能把urlmol.dll以及其使用方法用邮件发给我吗。我的邮件是gung_@163.com,我愿意出200分。
 
轻松虎:
你好,我最近也是做一个类似的程序,不过,同soFTangeL不一样的是,我必须实现断点续传,这把我给难倒了,不知你有没有这方面的资料和例程,能否提供给我。急切的盼望。先行谢过。
 
直接用API吧:
uses
WinINet

function UrlGetFile(const URL, AFile: string): Boolean;
var
hFile, HInet: HINTERNET;
Buffer: array[0..32767] of Char;
BufRead: Cardinal;
BufSize: Cardinal;
begin
Result := False;
HInet := InternetOpen('Agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(HInet) then
try
hFile := InternetOpenUrl(HInet, PChar(URL), nil, 0, INTERNET_FLAG_RELOAD + INTERNET_FLAG_KEEP_CONNECTION, 0);
if Assigned(hFile) then
try
BufSize := SizeOf(Buffer);
with TFileStream.Create(AFile, fmCreate) do
try
while InternetReadFile(hFile, @Buffer, BufSize, BufRead) and (BufRead > 0) do
Write(Buffer, BufRead);
Result := True;
finally
Free;
end;
finally
InternetCloseHandle(hFile);
end;
finally
InternetCloseHandle(hinet);
end;
end;
 
urlmon.dll是系统的文件,urlmon.pas是delphi的文件,上面写的就是用法,不能断点续传。

 
谢谢各位。现在分赃![:D]
 
汗……另外三位个个都比我高手……

你应该把分给xianjun和轻松虎。
 
后退
顶部