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

 
gchrmt4:
...しかし、このスクリプトは、ライセンスクエリの結果のような短いサーバーレスポンスを取得する場合には、まだ動作するはずです。サーバーのレスポンスのサイズが1KB程度を超える場合のみ問題が発生します。

ありがとうございます、これで完璧です
 

thili55さん、こんにちは。

grabWeb()をビルド600で動作させるための解決策を投稿していただけませんか?多くの人が、FFCalをビルド600で動作させることに興味があると思います。

ありがとうございます。

 
bennyHanna:

grabWeb()をビルド600で動作させるための解決策を投稿していただけませんか?多くの人が、FFCalをビルド600で動作させることに興味があると思うのですが。

thili55が返信している投稿を 参照してください - しかし、現在v600には文字列処理の問題があるようで、FFカレンダーのように多くのデータをダウンロードすることに影響するかもしれないことに留意してください。
 
gchrmt4:
thili55が返信している投稿を ご覧ください。ただし、現在v600では文字列処理の問題があるようで、FFカレンダーのように多くのデータをダウンロードすることに影響があるかもしれませんので、ご注意ください。


ご回答ありがとうございます。 つまり、grabWebの解決策を考える前に、v600の修正を待つ必要があるということですね?それともv603で修正されたのでしょうか?

 
bennyHanna:


ご回答ありがとうございます。 ということは、grabWebの解決策を考えるには、v600の修正を待つ必要があるということでしょうか?それともv603で修正されたのでしょうか?

あなたはこの問題を理解していないようです。mql4の変更を考慮し、コードを修正する必要があります。
 

以下は、v600で動作するように更新されたGrabWeb関数です。 InternetOpenWとInternetOpenUrlWを 使用し、ユニコードの変換を 行うようになりました。 XMLファイルを取得することはできますが、ファイルはすべてNULLデータを持っています。コード中のStrWebPageのPrint文を見てください。 出力されたデータを見ると、strThisReadは有効なデータを持っているのに、それはゴミです。誰かが見て、彼らが修正を見つけることができるかどうか見ることができますか? このスレッドの修正に従います: https://www.mql5.com/en/forum/149360。

FFCal.mq4にコードをコピー&ペーストして、v600 MT4でコンパイルして実行するだけです(コンパイルできるように、あなたのバージョンに属さない項目は編集してください)。

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
 

GRABWEBスクリプトを作ってみました。

非常にシンプルで、ビルド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:

GRABWEBスクリプトを作ってみました。

非常にシンプルで、ビルド604で問題なく動作しています。


このコードの行について、v604でのコンパイルエラーをどのように克服しているのか、お伺いしたいのですが。

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

Error: 'Buffer' -parameter conversion not allowed.

MT4のバージョンを確認し、もう一度試してみてください。



 
bennyHanna:


このコードの行について、v604でのコンパイルエラーをどのように克服しているのか、お聞きしてもよろしいでしょうか。

エラー: 'Buffer' - パラメータの変換は許可されていません。

MT4のバージョンをご確認の上、再度お試しください。




私のv604とv600ではそのようなエラーはありません。このプログラムではエラーも警告もなく、ファイルは正しくダウンロードされました
WDholic

GRABWEBスクリプトを作成してみました。

非常にシンプルで、ビルド604で問題なく動作しています。

私も試してみましたが、うまくいきました。
 
bennyHanna:


このコードの行について、v604でのコンパイル・エラーをどのように克服しているのか、お伺いしてもよろしいでしょうか。

エラー: 'Buffer' - パラメータの変換は許可されていません。

MT4のバージョンを確認して、もう一度試してみてください。




uチャネルを使用している可能性があります。

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

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

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