脚本: WININET_TEST

WININET_TEST:

这是一个演示如何使用WININET.DLL库从互联网上下载页面(文件)的简单实例。

 

作者: MetaQuotes Software Corp.

请问能否在读取文件之前知道文件的长度?这样才能在文件量大、速度慢的情况下估算出加载数据的百分比。

gdtt:

请问能否在读取文件之前知道文件的长度?这样就能在文件量大、速度慢的情况下估计下载数据的百分比。

我想可以。您可以在 msdn 对 wininet.dll 的描述中找到它。

gdtt:

请问能否在读取文件之前知道文件的长度?这是为了在文件量大、速度慢的情况下估计加载数据的百分比。

在 /GET 请求前发送 /HEAD
sergeev:

您可以在 msdn 对 wininet.dll 的描述中找到它。


我想这将是一篇全面披露wininet.dll使用 情况的文章的好主题。

我完全赞成!这将是一篇非常有用的文章。
gdtt:

请问能否在读取文件之前知道文件的长度?这是为了在文件量大、速度慢的情况下估算下载数据的百分比。

如果服务器报告内容长度,则有可能。

要获取有关请求的信息,可以使用 wininet.dll 中的HttpQueryInfo 函数--该函数以字符串形式向指定数组返回所需的信息。

使用示例

在 #import 部分添加说明:

int HttpQueryInfoW(int hRequest,int dwInfoLevel,uchar &lpvBuffer[],int &lpdwBufferLength,int &lpdwIndex); 

同时添加

#define HTTP_QUERY_CONTENT_LENGTH 5

然后在调用 InternetOpenUrlW 并获取 hURL 后的代码中添加代码:

   int BufLen=2048;    int ind=0;    uchar buf0[2048];    string s="";    int ContentSize_HttpQueryInfoW=0;    int iRes;       iRes=HttpQueryInfoW(hURL,HTTP_QUERY_CONTENT_LENGTH,buf0,BufLen,ind);    if(iRes<=0)      {       Print("Error in call of HttpQueryInfoW()");      }    else      {       s="";       for(int k=0;k<BufLen;k++) { s=s+CharToString(buf0[k]);}       Print("HTTP_QUERY_CONTENT_LENGTH:",s);       if (StringLen(s)>0) ContentSize_HttpQueryInfoW=StringToInteger(s);       Alert("内容大小=",ContentSize_HttpQueryInfoW);      }     

也就是说,在开始下载(InternetReadFile)之前,我们就知道了内容的长度。

在当前版本的脚本中添加了此功能。

感谢您的努力!

它运行得非常好!

当我尝试运行它时,metatrader 出现致命错误并关闭。有什么解决方案吗?

我发现 Wininet 在 MT5 上次更新前可以正常工作。如果您找到解决这个问题的方法,请告诉我。
12
要添加评论,请登录注册