Scripts: WININET_TEST

 

WININET_TEST:

Voici un exemple simple qui montre comment télécharger une page (fichier) à partir d'Internet en utilisant la bibliothèque wininet.dll.

WININET_TEST

Auteur : MetaQuotes

 

Pouvez-vous me dire s'il est possible de connaître la longueur d'un fichier avant qu'il ne soit lu ? Ceci afin de pouvoir faire une estimation du pourcentage de données chargées dans le cas de gros volumes, de vitesses lentes.

 
gdtt:

Pouvez-vous me dire s'il est possible de connaître la longueur d'un fichier avant qu'il ne soit lu ? Ceci afin de pouvoir estimer le pourcentage de données téléchargées dans le cas de gros volumes, de vitesses lentes.

Je pense que oui. et vous le trouverez dans la description msdn de wininet.dll.

 
gdtt:

Pouvez-vous me dire s'il est possible de connaître la longueur d'un fichier avant qu'il ne soit lu ? Ceci afin de pouvoir faire une estimation du pourcentage de données chargées dans le cas de gros volumes, de vitesses lentes.

Envoyer /HEAD avant la requête /GET
 
sergeev:

Je pense que oui, et vous le trouverez dans la description msdn de wininet.dll.


Je suppose que ce serait un bon sujet pour un article avec une divulgation complète de l'utilisation de wininet.dll.

 
Ce sera un article très utile.
 
gdtt:

Pouvez-vous me dire s'il est possible de connaître la longueur d'un fichier avant qu'il ne soit lu ? Il s'agit de pouvoir faire une estimation du pourcentage de données téléchargées en cas de volumes importants, de vitesses lentes.

Il est possible que le serveur signale la longueur du contenu.

Pour obtenir des informations sur la requête, vous pouvez utiliser la fonction HttpQueryInfo de wininet.dll - cette fonction renvoie les informations requises dans le tableau spécifié sous forme de chaîne.

Exemple d'utilisation :

dans la section #import, ajouter une description :

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

ajouter également

#define HTTP_QUERY_CONTENT_LENGTH 5

Ensuite, dans le code, après avoir appelé InternetOpenUrlW et obtenu hURL, vous devez ajouter le code :

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

dans notre exemple de test de yandex.ru, nous obtenons "Content size= 44649", ce qui correspond à la taille du fichier téléchargé. c'est-à-dire qu'avant le début du téléchargement (InternetReadFile), nous connaissons la longueur du contenu.

 

Cette fonctionnalité a été ajoutée à la version actuelle du script.

 

Merci pour cet effort !

Cela fonctionne parfaitement !

 

Lorsque j'essaie de l'exécuter, le metatrader se ferme avec une erreur fatale. Une solution ?

 
J'ai trouvé que wininet fonctionnait avant la dernière mise à jour de MT5. Mais je n'ai toujours pas trouvé de solution pour le faire fonctionner à nouveau. Faites-moi savoir si vous avez trouvé comment résoudre ce problème.