GrabWeb在MT4 Build 600上不工作 - 页 3

[删除]  
WDholic:


也许你使用的是u字符

在我的脚本中,我使用了字符串


是的,这就是问题所在。 现在它在v604中编译得很好。 因此,基本上我们需要使用InternetOpenW和 InternetOpenUrlW,并像以前一样连接字符串。

 
bennyHanna:


是的,这就是问题所在。现在它在v604中编译得很好。因此,基本上我们需要使用InternetOpenW和 InternetOpenUrlW,并像以前一样连接字符串。

我一直在使用上面的代码,是由WDHolic开发的,自从build 600出现后就成功了(非常感谢:-))。 不幸的是,当我今天偶然在build 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,看看是否能把它纳入我的代码中。 非常感谢你的建议--我会把我的经验发回来--希望能成功 :-)

谢谢。

Greg

 
ydrol:
有什么理由不使用WebRequest 代替?

我在我的新闻提醒器中使用了WebRequest,但WebRequest确实有一个缺点,并不适合所有人:它只能在EA中使用。

来自WebRequest 文档。

WebRequest()函数是异步的,这意味着它中断了程序的执行,等待来自被请求服务器的响应。由于接收响应的延迟可能很大,该函数不能用于指标的调用,因为指标在一个符号上的所有指标和图表共享的共同线程中运行。一个符号的某个图表上的指标性能延迟可能会停止更新同一符号的所有图表。

 
honest_knave:

我在我的新闻提醒器中使用了WebRequest,但WebRequest确实有一个缺点,不适合所有人:它只能在EA中使用。

WebRequest()函数是异步的,这意味着它中断了程序的执行,等待来自被请求服务器的响应。由于接收响应的延迟可能很大,该函数不能用于指标的调用,因为指标在一个符号上的所有指标和图表共享的共同线程中运行。一个符号的一个图表上的指标性能延迟可能会停止同一符号的所有图表的更新。

应该是同步的。
 
angevoyageur:
应该是同步的。

我目前的要求是在EA中,所以WebRequest可能是短期的答案。

然而,我确实有一些访问新闻的指标,这意味着我必须尝试在 Grabweb 中改变什么,如果我想让它们继续保持可维护性的话。 我想知道这篇文章中的信息是否会提供答案:https://www.mql5.com/en/articles/73 ?

 
gregspinner:

我目前的要求是在EA中,所以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个字节的内存上大喊大叫,还是系统足够聪明,能动态分配存储? 希望是后者

干杯。

Greg

 
答案也在这个话题的第一页。谢谢你的分享。
 
thili55:

这段代码对我来说是完美无缺的,直到在MT4 build 600中测试时,它不再从我的服务器上验证账户。


大家好,请问这段代码是怎么回事,是一个指标还是EA?我试着在mql4编辑器中运行它,我得到了以下错误信息。

'User - undeclared identifier

它实际上指的是下面这行代码。


(行:112)GrabWeb("http://www.website.com/query.php?accountnumber="+AccountNumber()+"&login="+User, answer)。


如何声明 "用户 "能被程序接受,或者我可以用什么来代替 "用户"?

我使用的是Windows 8.1,64位操作系统,MT4版本4.00,build 1010。

预先感谢你。