GrabWeb ne fonctionne pas sur MT4 Build 600 - page 2

 
gchrmt4:
...Cependant, ce script devrait toujours fonctionner pour récupérer des réponses courtes du serveur, comme les résultats d'une requête de licence. Il ne pose problème que si la taille de la réponse du serveur dépasse 1KB-ish.

Merci, cela a parfaitement fonctionné !
 

Salut thili55,

Peux-tu nous aider et poster ta solution pour faire fonctionner grabWeb() avec le build 600 ? Je pense que beaucoup de personnes seraient intéressées par le fait que FFCal fonctionne avec la version 600.

Merci beaucoup

 
bennyHanna:

Pouvez-vous nous aider et poster votre solution pour faire fonctionner grabWeb() avec le build 600 ? Je pense que beaucoup de personnes seraient intéressées par le fait que FFCal fonctionne avec la version 600.

Voir le message auquel thili55 répond - mais notez qu'il semble y avoir actuellement des problèmes de gestion des chaînes de caractères dans la v600 qui peuvent affecter le téléchargement d'autant de données que le calendrier FF.
 
gchrmt4:
Voir le message auquel thili55 répond - mais notez qu'il semble y avoir actuellement des problèmes de traitement des chaînes dans la v600 qui peuvent affecter le téléchargement d'autant de données que le calendrier FF.


Merci pour votre réponse. Donc, nous devrons attendre une correction de la v600 avant de concevoir une solution pour grabWeb, correct ? Ou est-ce qu'un correctif a été fourni dans la v603 ?

 
bennyHanna:


Merci pour votre réponse. Nous devrons donc attendre la correction de la v600 avant de trouver une solution pour grabWeb, n'est-ce pas ? Ou est-ce qu'un correctif a été fourni dans la v603 ?

Il semble que vous ne compreniez pas le problème. Le code doit être corrigé pour prendre en compte le changement dans mql4.
 

Voici la fonction GrabWeb mise à jour pour fonctionner sur la v600. Elle utilise maintenant InternetOpenW et InternetOpenUrlW et la conversion de l'unicode. Elle obtient bien les fichiers XML mais les fichiers ont tous des données NULL. Voir l'instruction Print pour StrWebPage dans le code. Si vous regardez les données produites, ce sont des déchets alors que strThisRead contient des données valides. Quelqu'un peut-il jeter un coup d'oeil et voir s'il peut trouver une solution ? Il suit le correctif de ce fil de discussion : https://www.mql5.com/en/forum/149360

Il suffit de copier et de coller le code dans votre FFCal.mq4 et de le compiler avec la v600 MT4 et de l'exécuter (veuillez supprimer les éléments qui n'ont pas leur place dans votre version afin qu'elle soit compilée).

bool bWinInetDebug = false;

#define  READURL_BUFFER_SIZE   1000

#import "wininet.dll"
   int InternetOpenW(string, int, string, string, int);
   int InternetOpenUrlW(int, string, string, int, int, int);
   int InternetReadFile(int, uchar & arr[], int, int & arr[]);
   int InternetCloseHandle(int);
#import

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
bool GrabWeb(string strUrl, string& strWebPage)
   {
           int     hInternet;
           int     hInternetUrl;
           bool    bSuccess = false;
           
           // Get an internet handle
           hInternet = InternetOpenW("mt4", 0 /* 0 = INTERNET_OPEN_TYPE_PRECONFIG */, NULL, NULL, 0);
        
           if (bWinInetDebug) 
                   Log("hInternet: " + hInternet);   
                   
           if (hInternet == 0) 
         {     
            Message = Symbol() + " " + IndicatorName + " Error 890 - Unable to get an Internet Handle!";
            Print(Message);
            Alert(Message);                                     
            HealthBuffer[0] = Error_state; 
            bSuccess = false;
         }
      else
         {         
            // Get a URL handle
            hInternetUrl = InternetOpenUrlW(hInternet, NewsURL, NULL, 0, 0, 0);
            
           if (bWinInetDebug) 
                   Log("hInternetUrl: " + hInternetUrl);   

           if (hInternetUrl == 0) 
               {     
                  Message = Symbol() + " " + IndicatorName + " Error 891 - Unable to get a URL handle!";
                  Print(Message);
                  Alert(Message);                           
                  HealthBuffer[0] = Error_state; 
                  bSuccess = false;
               }
            else
               {
                  Print("Reading URL: " + strUrl);
                       
                       bool bKeepReading = true;
                  
                  while (bKeepReading) 
                     {                    
                                            int   lReturn[1];
                                            uchar arrReceive[];
                                            
                                            ArrayResize(arrReceive, READURL_BUFFER_SIZE + 1);
                        
                        int success = InternetReadFile(hInternetUrl, arrReceive, READURL_BUFFER_SIZE, lReturn);
            
                        if (success == 0) 
                           {
                              Message = Symbol() + " " + IndicatorName + " Error 892 - Unable to read News Database WebPage!";
                              Print(Message);
                              Alert(Message);                                  
                              HealthBuffer[0] = Error_state; 
                              bKeepReading = false;
                              bSuccess = false;
                           }
                        else 
                           {
                                   if (bWinInetDebug) 
                                           Log("success: " + success);
                                   
                                   if (bWinInetDebug) 
                                           Log("arrReceive: " + arrReceive[0]);    

                                   if (bWinInetDebug) 
                                           Log("lReturn: " + lReturn[0]);
                                   
                              // InternetReadFile() has succeeded, but we may be at the end of the data 
                              if (lReturn[0] == 0) 
                                 {
                                    if (bWinInetDebug) 
                                       Print("Reached end of data");
                                    
                                    bKeepReading = false;
                                    bSuccess = true;
                                 } 
                              else 
                                 {
                                    // Convert the data from Ansi to Unicode using the built-in MT4 function
                                    string strThisRead = CharArrayToString(arrReceive, 0, lReturn[0], CP_UTF8);
                                    strWebPage = StringConcatenate(strWebPage, strThisRead);  // <-- PROBLEM HERE ON FIRST USE ONLY IN EACH MT4 SESSION
                                 Print ("------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  strWebPage : ", strWebPage);  // this shows garbage!
				}
                           }
                     }
               }
         }

      Print("Closing URL web connection");
           success = InternetCloseHandle(hInternetUrl);
           
           if (success == 0) 
         {     
            Message = Symbol() + " " + IndicatorName + " Error 896 - Unable to close URL handle!";
            Print(Message);
            Alert(Message);                                  
            HealthBuffer[0] = Error_state; 
            bSuccess = false;
         }
      else
         {
                 success = InternetCloseHandle(hInternet);

           if (success == 0) 
               {     
                  Message = Symbol() + " " + IndicatorName + " Error 898 - Unable to close Internet Handle!";
                  Print(Message);
                  Alert(Message);                                  
                  HealthBuffer[0] = Error_state; 
                  bSuccess = false;
               }
              }
              
           return(bSuccess);
   
   } // end of function
 

J'ai essayé de créer un script GRABWEB.

très simple... et fonctionne bien dans le build 604

 
#import  "Wininet.dll"
   int InternetOpenW(string, int, string, string, int);
   int InternetConnectW(int, string, int, string, string, int, int, int); 
   int HttpOpenRequestW(int, string, string, int, string, int, string, int); 
   int InternetOpenUrlW(int, string, string, int, int, int);
   int InternetReadFile(int, string, int, int& OneInt[]);
   int InternetCloseHandle(int); 
   
#import
 
int start()
{
   string URL="http://www.forexfactory.com/ff_calendar_thisweek.xml";
  
    int HttpOpen = InternetOpenW(" ", 0, " "," ",0 ); 
    int HttpConnect = InternetConnectW(HttpOpen, "", 80, "", "", 3, 0, 1); 
    int HttpRequest = InternetOpenUrlW(HttpOpen,URL, NULL, 0, 0, 0);
   
   int read[1];
   string Buffer = " ";
   string NEWS = "";
 
   while (true)
   {
      InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
      if (read[0] > 0) NEWS = NEWS + StringSubstr(Buffer, 0, read[0]);
      else             break;
   }
   
 
   
   if (HttpRequest > 0) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0) InternetCloseHandle(HttpOpen);  
     MessageBox(NEWS, "HTTP READ:" );     //  i show the result via message box
 
   //----
   return(0);
}
  
//+------------------------------------------------------------------+
 
WDholic:

j'essaie de faire un script GRABWEB

très simple... et qui fonctionne bien dans le build 604


Puis-je vous demander comment vous surmontez cette erreur de compilation avec la v604 pour cette ligne de code :

InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);

Erreur : 'Buffer' - conversion de paramètre non autorisée.

Veuillez vérifier votre version MT4 et réessayer !



 
bennyHanna:


Puis-je vous demander comment vous surmontez cette erreur de compilation avec la v604 pour cette ligne de code :

Erreur : 'Buffer' - conversion de paramètre non autorisée

Veuillez vérifier votre version de MT4 et réessayer !




Il n'y a pas de telle erreur sur mon v604 et v600 avec ce programme aucune erreur et aucun avertissement le fichier a été téléchargé correctement
WDholic:

J'ai essayé de créer un script GRABWEB.

très simple... et qui fonctionne bien dans la version 604.

J'ai essayé, ça marche pour moi aussi.... merci
 
bennyHanna:


Puis-je vous demander comment vous surmontez cette erreur de compilation avec la version 604 pour cette ligne de code ?

Erreur : 'Buffer' - conversion de paramètre non autorisée

Veuillez vérifier votre version de MT4 et réessayer !




peut-être que vous utilisez u char

 int InternetReadFile(int, uchar & arr[], int, int & arr[]);

Dans mon script, j'utilise une chaîne

int InternetReadFile(int, string, int, int& OneInt[]);