GrabWeb не работает на MT4 Build 600 - страница 3

 
WDholic:


может быть, вы используете u char

в моем скрипте я использую строку


Да, проблема была в этом. Теперь он прекрасно компилируется с v604. Итак, в основном нам нужно использовать InternetOpenW и InternetOpenUrlW и конкатенировать строку так же, как и раньше.

 
bennyHanna:


Да, это была проблема. Теперь он прекрасно компилируется с v604. Итак, в основном нам нужно использовать InternetOpenW и InternetOpenUrlW и конкатенировать строку так же, как и раньше.

Я использовал приведенный выше код, разработанный WDHolic, успешно с момента появления билда 600 (большое спасибо :-)). К сожалению, когда я перекомпилировал код сегодня, под билд 830, я обнаружил, что он больше не работает. Интересно, может ли какой-нибудь добрый человек предложить твик, чтобы он снова заработал? Код, который я использую, выглядит следующим образом:

string secData="";
   
if (!GrabWeb(secURL, secData))
{
   showDebug("Unable to access user file");
   return(1);  
}
.
.
.
.
#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
 
bool GrabWeb(string strUrl, string& strWebPage)
{
  
    int HttpOpen = InternetOpenW(" ", 0, " "," ",0 ); 
    int HttpConnect = InternetConnectW(HttpOpen, "", 80, "", "", 3, 0, 1); 
    int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL, 0, 0, 0);
   
   int read[1];
   string Buffer = " ";
 
   while (true)
   {
      InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
      if (read[0] > 0) strWebPage = strWebPage + StringSubstr(Buffer, 0, read[0]);
      else             break;
   }
   
   if (HttpRequest > 0) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0) InternetCloseHandle(HttpOpen);  
 
   return(true);
}

Теперь он, похоже, возвращает только пробелы.

Любая помощь будет принята с большой благодарностью. Спасибо за ожидание,

Грег

 
Есть ли причины не использовать WebRequest вместо этого?
 
ydrol:
Есть ли причины не использовать WebRequest вместо этого?

Только Grabweb - это первый метод, с которым я столкнулся несколько лет назад, и было проще придерживаться его, чем исследовать другие варианты! Я посмотрю на WebRequest и посмотрю, смогу ли я встроить его в свой код. Большое спасибо за предложение - я напишу о своем опыте - надеюсь, успешном :-)

Спасибо,

Грег

 
ydrol:
Есть ли причины не использовать WebRequest вместо этого?

Я использую WebRequest в своем новостном оповещателе, но у WebRequest есть один недостаток, который подойдет не всем: его можно использовать только в советнике.

Из документации WebRequest:

Функция WebRequest() является асинхронной, что означает, что она прерывает выполнение программы и ожидает ответа от запрашиваемого сервера. Поскольку задержки при получении ответа могут быть большими, функция недоступна для вызовов индикаторов, так как индикаторы работают в общем потоке, разделяемом всеми индикаторами и графиками на одном символе. Задержка работы индикатора на одном из графиков символа может остановить обновление всех графиков того же символа.

 
honest_knave:

Я использую WebRequest в своем новостном оповещателе, но у WebRequest есть один недостаток, который подойдет не всем: его можно использовать только в советнике.

Функция WebRequest() является асинхронной, то есть она прерывает выполнение программы и ожидает ответа от запрашиваемого сервера. Поскольку задержки при получении ответа могут быть большими, функция недоступна для вызовов из индикаторов, так как индикаторы работают в общем потоке, разделяемом всеми индикаторами и графиками на одном символе. Задержка работы индикатора на одном из графиков символа может остановить обновление всех графиков того же символа.

Должно быть синхронным.
 
angevoyageur:
Должно быть синхронным.

Моя текущая потребность - в советнике, поэтому WebRequest, вероятно, будет краткосрочным ответом.

Однако у меня есть ряд индикаторов, которые обращаются к новостям, что означает, что мне придется попытаться выяснить, что нужно изменить в Grabweb, если я хочу, чтобы они оставались поддерживаемыми. Интересно, даст ли информация в этой статье ответ:https://www.mql5.com/en/articles/73 ?

 
gregspinner:

Моя текущая потребность - в советнике, поэтому WebRequest, вероятно, будет краткосрочным ответом.

Однако у меня есть ряд индикаторов, которые обращаются к новостям, что означает, что мне придется попытаться выяснить, что нужно изменить в Grabweb, если я хочу, чтобы они оставались поддерживаемыми. Интересно, даст ли информация в этой статье ответ:https://www.mql5.com/en/articles/73 ?

Думаю, я нашел ответ - и он был в статье, упомянутой выше. Код GrabWeb теперь выглядит следующим образом:

#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 InternetReadFile(int, uchar &sBuffer[], int, int& OneInt);
   int InternetCloseHandle(int); 
   
#import
 
bool GrabWeb(string strUrl, string& strWebPage)
{
  
    int HttpOpen = InternetOpenW(" ", 0, " "," ",0 ); 
    int HttpConnect = InternetConnectW(HttpOpen, "", 80, "", "", 3, 0, 1); 
    int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL, 0, 0, 0);
   
   /*int read[1];
   string Buffer = " ";
 
   while (true)
   {
      InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
      if (read[0] > 0) strWebPage = strWebPage + StringSubstr(Buffer, 0, read[0]);
      else             break;
   }*/
   
   uchar ch[500];
   string toStr="";
   int dwBytes,h;
   while(InternetReadFile(HttpRequest,ch,500,dwBytes))
   {
      if(dwBytes<=0) break;
      toStr=toStr+CharArrayToString(ch,0,dwBytes);
   }
   
   strWebPage=toStr;   
   
   if (HttpRequest > 0) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0) InternetCloseHandle(HttpOpen);  
 
   return(true);
}

В основном...

1) изменил определение InternetRead, чтобы использовать косвенную ссылку на массив uchar для данных, а также использовать прямую простую переменную int для подсчета.

2) заставил функцию InternetRead использовать массив uchar, а затем преобразовал заполненный массив в строку.

Я не очень понимаю, как влияет размер массива uchar. Похоже, что функция читает всю веб-страницу (например, FFCal XML), а это больше 500 байт. Это просто переполнение следующих n байт памяти, или система достаточно умна, чтобы динамически выделять память? Надеюсь, что последнее!

Будьте здоровы,

Грег

 
Ответ был также на первой странице этой темы. Спасибо, что поделились.
 
thili55:

Этот код работал безупречно до тех пор, пока я не протестировал его в MT4 build 600, где он больше не верифицирует счета с моего сервера.


Привет, ребята, пожалуйста, что это за код, это индикатор или советник? Я попробовал запустить его в редакторе mql4 и получил следующее сообщение об ошибке:

'User - undeclared identifier'.

На самом деле это относится к следующей строке кода:


(Строка: 112) GrabWeb("http://www.website.com/query.php?accountnumber="+AccountNumber()+"&login="+User, ответ);


Как объявить "User", чтобы программа приняла его, или чем я могу заменить "User"?

Я использую Windows 8.1, 64-битную ОС, и MT4 версии 4.00, build 1010.

Заранее спасибо.