Скрипты: 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) мы узнали длину содержимого.

 

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

 

Спасибо за старания!

Работает отлично!

 

Когда я пытаюсь запустить его, метатрейдер закрывается с фатальной ошибкой. Есть решение?

 
Я обнаружил, что wininet работал до последнего обновления MT5. Но я все еще не могу найти решение, чтобы заставить его работать снова. Пожалуйста, дайте мне знать, если вы найдете, как преодолеть эту проблему.