【发布时间】:2010-06-26 01:01:08
【问题描述】:
我想从 Internet 下载文件,而 InternetReadFile 乍一看似乎是一个很好且简单的解决方案。事实上,好得令人难以置信。确实,挖掘了一下我已经开始看到它实际上存在很多问题。人们在使用此代码时抱怨各种问题。
出现问题的原因可能是:
- 应用程序会暂时冻结,直到 HTTP 服务器响应
- 由于 Internet 连接中断,应用程序暂时冻结
- 应用程序锁定,因为 HTTP 服务器从不响应
- InternetOpen(我最近才发现)在应用程序生命周期内只能调用一次
我找不到关于如何正确和稳健地使用它的完整示例。有没有人知道如何在一个单独的线程中实现它并超时?还有另一种简单的方法可以从 Internet 可靠地下载文件。虽然我不想让绝地甚至印地这样的大型图书馆使我的生活变得复杂。
function GetFileHTTP (const fileURL, FileName: String): boolean;
CONST
BufferSize = 1024;
VAR
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
// result := false;
sAppName := ExtractFileName(Application.ExeName) ;
hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ; { be aware that InternetOpen need only be called once in your application!!!!!!!!!!!!!! }
TRY
hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0) ;
TRY
AssignFile(f, FileName) ;
Rewrite(f, 1) ;
REPEAT
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen)
UNTIL BufferLen = 0;
CloseFile(f) ;
Result:= True;
FINALLY
InternetCloseHandle(hURL)
end
FINALLY
InternetCloseHandle(hSession)
END;
END;
编辑: 此函数检查 Internet 连接是否可用。它似乎也适用于Win98。
{ Are we connected to the Internet? }
function IsConnectedToInternet: Boolean; { Call SHELL32.DLL for Win < Win98 otherwise call URL.dll }
var InetIsOffline: function(dwFlags: DWORD): BOOL; stdcall;
begin
Result:= FALSE;
if IsApiFunctionAvailable('URL.DLL', 'InetIsOffline', @InetIsOffline)
then Result:= NOT InetIsOffLine(0)
else
if IsApiFunctionAvailable('SHELL32.DLL', 'InetIsOffline', @InetIsOffline)
then Result:= NOT InetIsOffLine(0)
end;
我正在使用 Delphi 7。非常感谢。
编辑:
因为应用程序在第一次启动时挂起而失去客户是赔钱的完美秘诀。
编写依赖于 Microsoft 平台的代码是不好的。你永远不知道客户是否安装了 IE 版本 x.x。
将东西安装到用户的计算机中就像玩枪一样。会适得其反。
(在此处查看更多信息:http://thesunstroke.blogspot.com/2010/06/programmig-like-there-is-no-ms-windows.html)
【问题讨论】:
-
这是一个有用的问题,请将下载和/或文件下载添加到标签(连同 delphi 标签)以及 wininet 和 indy(如果适用)