MT4 Build 600でGrabWebが動作しない。 - ページ 3

 
WDholic:


もしかしたら、u文字を使っているかもしれません。

私のスクリプトでは、文字列を使用しています。


はい、それが問題でした。 現在は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はEAでしか使えないという欠点があり、万人受けするものではありません。

WebRequestの ドキュメントより。

WebRequest() 関数は非同期です。つまり、プログラムの実行を中断して、要求されたサーバーからの応答を待ちます。応答を受け取る際の遅延が大きくなる可能性があるため、インジケータは1つのシンボル上のすべてのインジケータとチャートで共有される共通スレッドで実行されるため、この関数はインジケータからの呼び出しに使用できません。あるシンボルのチャートの1つでインジケータのパフォーマンスが遅延すると、同じシンボルのすべてのチャートの更新が停止することがあります。

 
honest_knave:

私はニュースアラートでWebRequestを使っていますが、WebRequestはEAでしか使えないという、万人受けはしない欠点があります。

WebRequest()関数は非同期式 で、プログラムの実行を中断して、要求したサーバーからの応答を待ちます。レスポンス受信の遅延が大きいため、この関数はインジケータからの呼び出しには使用できません。インジケータは、1つのシンボル上のすべてのインジケータとチャートで共有される共通スレッドで実行されるからです。あるシンボルのチャートの一つでインジケータのパフォーマンスが遅延した場合、同じシンボルのすべてのチャートの更新が停止することがあります。

同期であるべきです。
 
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

 
このトピックの1ページ目にも回答がありました。シェアしていただきありがとうございます。
 
thili55:

このコードは、MT4ビルド600でテストするまでは完璧に動作していましたが、私のサーバーからアカウントを確認しなくなりました。


こんにちは、このコードは何でしょうか、インジケータかEAでしょうか?mql4エディターで実行してみましたが、次のようなエラーメッセージが表示されました。

'User - undeclared identifier'というエラーメッセージが出ました。

実はこれ、以下の行のコードを指しているのです。


(Line: 112) GrabWeb("http://www.website.com/query.php?accountnumber="+AccountNumber()+"&login="+User, answer).と表示されるのですが、これは何でしょうか?


どのようにプログラムによって受け入れられるように "User "を宣言することができますか、または私は "User "を何で置き換えることができますか?

私はWindows 8.1、64ビットOS、MT4バージョン4.00、ビルド1010を使用しています。

よろしくお願いします。