Script: WININET_TEST

 

WININET_TEST:

Ecco un semplice esempio che mostra come scaricare una pagina (file) da Internet utilizzando la libreria wininet.dll.

WININET_TEST

Autore: MetaQuotes

 

Potete dirmi se è possibile conoscere la lunghezza di un file prima che venga letto? Questo per poter fare una stima della percentuale di dati caricati in caso di grandi volumi e velocità ridotte.

 
gdtt:

Potete dirmi se è possibile conoscere la lunghezza di un file prima che venga letto? Questo per poter stimare la percentuale di dati scaricati in caso di grandi volumi e velocità ridotte.

Penso che sia possibile. e lo troverete nella descrizione msdn di wininet.dll.

 
gdtt:

Potete dirmi se è possibile conoscere la lunghezza di un file prima che venga letto? Questo per poter fare una stima della percentuale di dati caricati in caso di grandi volumi e velocità ridotte.

Inviare /HEAD prima della richiesta /GET
 
sergeev:

Penso che sia possibile. e lo troverete nella descrizione msdn di wininet.dll.


Immagino che sarebbe un buon argomento per un articolo con la divulgazione completa dell'uso di wininet.dll.

 
Sono d'accordo! Sarà un articolo molto utile.
 
gdtt:

Potete dirmi se è possibile conoscere la lunghezza di un file prima che venga letto? Questo per poter fare una stima della percentuale di dati scaricati in caso di grandi volumi e velocità ridotte.

Esiste la possibilità che il server riporti la lunghezza del contenuto.

Per ottenere informazioni sulla richiesta è possibile utilizzare la funzione HttpQueryInfo di wininet.dll: questa funzione restituisce le informazioni richieste all'array specificato in forma di stringa.

Esempio di utilizzo:

nella sezione #import, aggiungere una descrizione:

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

aggiungere anche

#define HTTP_QUERY_CONTENT_LENGTH 5

poi nel codice dopo aver chiamato InternetOpenUrlW e aver ottenuto hURL è necessario aggiungere il codice:

   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("Contenuto=",ContentSize_HttpQueryInfoW);
     }     

nel nostro esempio di test da yandex.ru otteniamo "Content size= 44649", che corrisponde alla dimensione del file scaricato. cioè prima dell'inizio del download (InternetReadFile) conosciamo la lunghezza del contenuto.

 

Aggiunta questa funzione alla versione attuale dello script.

 

Grazie per l'impegno!

Funziona perfettamente!

 

Quando provo ad eseguirlo la metatrader si chiude con un errore fatale. Qualche soluzione?

 
Ho scoperto che wininet funzionava prima dell'ultimo aggiornamento di MT5. Ma non riesco ancora a trovare una soluzione per farlo funzionare di nuovo. per favore fatemi sapere se trovate come superare questo problema.