Скрипты: WININET_TEST

 

WININET_TEST:

Простой пример использования функций библиотеки wininet.dll для загрузки страниц или файлов из Internet.

Для работы установите опцию "Разрешить импорт DLL" и запустите скрипт на любом графике.

Автор: MetaQuotes

 

Подскажите, есть ли возможность узнать длину файла до его чтения? Это для того, чтобы можно было сделать оценку процентов загруженных данных в случае больших объемов, медленных скоростей.

 
gdtt:

Подскажите, есть ли возможность узнать длину файла до его чтения? Это для того, чтобы можно было сделать оценку процентов загруженных данных в случае больших объемов, медленных скоростей.

думаю что можно. и в описании на msdn по wininet.dll это вы найдёте.


 
gdtt:

Подскажите, есть ли возможность узнать длину файла до его чтения? Это для того, чтобы можно было сделать оценку процентов загруженных данных в случае больших объемов, медленных скоростей.

Перед /GET запросом послать /HEAD
 
sergeev:

думаю что можно. и в описании на msdn по wininet.dll это вы найдёте.


Предполагаю будет хорошей темой для статьи с полным раскрытием применения wininet.dll

 

я только за! очень пользительная будет статья.
 
gdtt:

Подскажите, есть ли возможность узнать длину файла до его чтения? Это для того, чтобы можно было сделать оценку процентов загруженных данных в случае больших объемов, медленных скоростей.

возможность есть, если сервер сообщает длину содержимого.

Для получения информации о запросе можно использовать функцию HttpQueryInfo из wininet.dll - эта функция возвращает требуемую информацию в указанный массив в строковом виде.

Пример использования:

в секции #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);
     }     

в нашем тестовом примере с yandex.ru получается "Размер содержимого= 44649", что соответствует размеру загруженного файла.  т.е. до начала загрузки (InternetReadFile) мы узнали длину содержимого.

 

Добавил эту возможность в текущую версию скрипта.


 

Замечательный код!

Но, раз уж вы разобрались с этими функциями, то не могли бы вы подсказать, как вместо записи в файл, получить просто функцию возвращающую строку.

А то что-то я с этими массивами пока никак не разберусь... 

 
Eugene1:

Замечательный код!

Но, раз уж вы разобрались с этими функциями, то не могли бы вы подсказать, как вместо записи в файл, получить просто функцию возвращающую строку.

А то что-то я с этими массивами пока никак не разберусь... 

Вот здесь скрипт запихивает полученные данные в строку с идентификатором s:

for(int k=0;k<BufLen;k++) { s=s+CharToString(buf0[k]);}
 
Это уже не актуально. Появилась стандартная функция webrequest
Документация по MQL5: Общие функции / WebRequest
Документация по MQL5: Общие функции / WebRequest
  • www.mql5.com
Общие функции / WebRequest - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5