Scripts: WININET_TEST

 

WININET_TEST:

Aqui está um exemplo simples que mostra como fazer download de uma página (arquivo) a partir da Internet usando a biblioteca wininet.dll.

Autor: MetaQuotes Software Corp.

 

Você pode me dizer se é possível saber o tamanho de um arquivo antes de ele ser lido? Isso é para poder fazer uma estimativa da porcentagem de dados carregados no caso de grandes volumes e velocidades lentas.

 
gdtt:

Você pode me dizer se é possível saber o tamanho de um arquivo antes de ele ser lido? Isso é para poder estimar a porcentagem de dados baixados no caso de grandes volumes e velocidades lentas.

Acho que é possível. E você encontrará isso na descrição msdn do wininet.dll.

 
gdtt:

Você pode me dizer se é possível saber o tamanho de um arquivo antes de ele ser lido? Isso é para poder fazer uma estimativa da porcentagem de dados carregados no caso de grandes volumes e velocidades lentas.

Enviar /HEAD antes da solicitação /GET
 
sergeev:

Acho que sim, e você a encontrará na descrição do msdn do wininet.dll.


Suponho que esse seria um bom tópico para um artigo com a divulgação completa do uso do wininet.dll

 
Eu concordo com isso, será um artigo muito útil.
 
gdtt:

Você pode me dizer se é possível saber o tamanho de um arquivo antes de ele ser lido? Isso é para poder fazer uma estimativa da porcentagem de dados baixados no caso de grandes volumes e velocidades lentas.

É possível se o servidor informar o tamanho do conteúdo.

Para obter informações sobre a solicitação, você pode usar a função HttpQueryInfo do wininet.dll - essa função retorna as informações necessárias para a matriz especificada em forma de cadeia de caracteres.

Exemplo de uso:

Na seção #import, adicione uma descrição:

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

adicione também

#define HTTP_QUERY_CONTENT_LENGTH 5

Então, no código, após chamar InternetOpenUrlW e obter hURL, você precisa adicionar o código:

   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("Tamanho do conteúdo=",ContentSize_HttpQueryInfoW);
     }     

Em nosso exemplo de teste do yandex.ru, recebemos "Content size= 44649", que corresponde ao tamanho do arquivo baixado. Ou seja, antes do início do download (InternetReadFile), sabemos o tamanho do conteúdo.

 

Esse recurso foi adicionado à versão atual do script.

 

Obrigado pelo esforço!

Funciona perfeitamente!

 

Quando tento executá-lo, o metatrader fecha com um erro fatal. Alguma solução?

 
Descobri que o wininet funcionava antes da última atualização do MT5. Mas ainda não consegui encontrar uma solução para fazê-lo funcionar novamente. Se você souber como resolver esse problema, entre em contato comigo.