Scripts: WININET_TEST

 

WININET_TEST:

He aquí un ejemplo simple que muestra cómo descargar una página(archivo) de Internet utilizando la biblioteca wininet.dll.

Autor: MetaQuotes Software Corp.

 

¿Pueden decirme si es posible conocer la longitud de un fichero antes de su lectura? Es para poder hacer una estimación del porcentaje de datos cargados en caso de grandes volúmenes, velocidades lentas.

 
gdtt:

¿Pueden decirme si es posible conocer la longitud de un fichero antes de su lectura? Es para poder estimar el porcentaje de datos descargados en caso de grandes volúmenes, velocidades lentas.

Creo que se puede. y lo encontraras en la descripcion msdn de wininet.dll.

 
gdtt:

¿Pueden decirme si es posible conocer la longitud de un fichero antes de su lectura? Es para poder hacer una estimación del porcentaje de datos cargados en caso de grandes volúmenes, velocidades lentas.

Enviar /HEAD antes de la petición /GET
 
sergeev:

Creo que se puede. y lo encontrará en la descripción msdn de wininet.dll.


Supongo que sería un buen tema para un artículo con la divulgación completa del uso de wininet.dll

 
Será un artículo muy útil.
 
gdtt:

¿Pueden decirme si es posible conocer la longitud de un fichero antes de su lectura? Esto es para poder hacer una estimación del porcentaje de datos descargados en caso de grandes volúmenes, velocidades lentas.

Existe la posibilidad si el servidor informa de la longitud del contenido.

Para obtener información sobre la petición se puede utilizar la función HttpQueryInfo de wininet.dll - esta función devuelve la información requerida al array especificado en forma de cadena.

Ejemplo de uso:

en la sección #import, añada una descripción:

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

añada también

#define HTTP_QUERY_CONTENT_LENGTH 5

entonces en el código después de llamar a InternetOpenUrlW y obtener hURL necesitas añadir el 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("Tamaño del contenido=",ContentSize_HttpQueryInfoW);
     }     

en nuestro ejemplo de prueba de yandex.ru obtenemos "Content size= 44649", que corresponde al tamaño del archivo descargado. es decir, antes del inicio de la descarga (InternetReadFile) conocemos la longitud del contenido.

 

Se ha añadido esta función a la versión actual del script.

 

¡Gracias por el esfuerzo!

¡Funciona perfectamente!

 

Cuando intento ejecutarlo el metatrader se cierra con un error fatal. ¿Alguna solución?

 
He descubierto que wininet funcionaba antes de la última actualización de MT5. Pero todavía no puedo encontrar una solución para que funcione de nuevo. por favor, hágamelo saber si usted encuentra la manera de superar este problema.