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

[Удален]  
WDholic:


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

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


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

Greg Spinner  
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);
}

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

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

Грег

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

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

Спасибо,

Грег

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

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

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

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

Alain Verleyen  
honest_knave:

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

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

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

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

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

Greg Spinner  
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 байт памяти, или система достаточно умна, чтобы динамически выделять память? Надеюсь, что последнее!

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

Грег

Alain Verleyen  
Ответ был также на первой странице этой темы. Спасибо, что поделились.
macpee  
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.

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