Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью. Миллионы трейдеров ждут хороших идей!
Grigoriy Malychenko
3161
Grigoriy Malychenko 2014.03.02 18:46 

Здравствуйте!

После обновления терминала с 509 до 610, в скрипте перестала работать функция InetToString(). Помогите ее исправить, я не могу понять в чем проблема.

В журнале отображается ошибка "Error when calling InternetOpenUrlA()"

А при попытке закрыть терминал появляется окно с ошибкой (прикрепил скрин к сообщению) и терминал на несколько минут зависает.

Привожу почти весь код скрипта, кроме собственных функций.

extern int Amount = 64; // Количество счетов в закладке Избранное окна Навигатор
extern int Pause  = 20; // Пауза между переключениями торговых счетов

//+------------------------------------------------------------------+
//|     Defines                                                      |
//+------------------------------------------------------------------+
#define HTTP_QUERY_CONTENT_LENGTH 0x00000005
#define HTTP_QUERY_FLAG_NUMBER    0x20000000
//----
#define INTERNET_OPEN_TYPE_DIRECT       0
#define INTERNET_OPEN_TYPE_PRECONFIG    0x00000000   // use registry configuration
#define INTERNET_FLAG_RELOAD            0x80000000
#define INTERNET_FLAG_NO_CACHE_WRITE    0x04000000
#define INTERNET_FLAG_PRAGMA_NOCACHE    0x00000100
//----
#define AGENT "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)"
//+------------------------------------------------------------------+
//|     Export Function from WINAPI                                    |
//+------------------------------------------------------------------+
#import "wininet.dll"
        int InternetAttemptConnect (int x);
        int InternetOpenA                                       ( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );
        int InternetOpenUrlA                            ( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext );
        int InternetReadFile                            ( int hFile, int& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );
        int InternetCloseHandle                 ( int hInet );
        int InternetQueryDataAvailable  ( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext );
        int HttpQueryInfoA                                      ( int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] );

#import "user32.dll"
  int GetParent( int hWnd );
  int GetDlgItem( int hDlg, int nIDDlgItem );
  int GetLastActivePopup( int hWnd );

#import
#define VK_HOME 0x24
#define VK_DOWN 0x28
#define VK_ENTER 0x0D


#property show_inputs

#include <WinUser32.mqh>

extern bool OnCycle = True;
int start()
{
 int i;
  
  Pause *= 1000;
 
for (i = 1; i <= Amount; i++)
  {
    Login(i);
    Sleep(Pause);

   string send = "http://site.ru";
   string Tmp = "";
   
   InetToString(send,Tmp);
   
      if(OnCycle)
      {
          if(i == Amount)
          {
          i = 0;
          }
      }
   }
   return(0);
}


//+------------------------------------------------------------------+
//| Подключается к счету, расположенному в строчке номер Num         |
//| в закладке Избранное окна Навигатор                              |
//+------------------------------------------------------------------+
void Login( int Num )
{
   int hwnd = WindowHandle(Symbol(), Period());
   int hwnd_parent = 0;
 
   while (!IsStopped())
   {
      hwnd = GetParent(hwnd);
      
      if (hwnd == 0)
        break;
        
      hwnd_parent = hwnd;
   }
   
   if (hwnd_parent != 0)  // нашли главное окно
   {
     hwnd = GetDlgItem(hwnd_parent, 0xE81C); // нашли Избранное окна Навигатор
     hwnd = GetDlgItem(hwnd, 0x52);
     hwnd = GetDlgItem(hwnd, 0x8A70);
     
     PostMessageA(hwnd, WM_KEYDOWN, VK_HOME,0); // верхняя строчка закладки Избранное окна Навигатор
     
     while (Num > 1)  
     {
       PostMessageA(hwnd, WM_KEYDOWN,VK_DOWN, 0); // сместились на нужную строчку
       Num--;
     }
 
     PostMessageA(hwnd, WM_KEYDOWN, VK_ENTER, 0);  // логин
     Sleep(1000);                                  // выждали
     
     hwnd = GetLastActivePopup(hwnd_parent);  // нашли форму логина
     PostMessageA(hwnd, WM_KEYDOWN, VK_ENTER, 0); // залогинились
   }
 
  return;
}



//+------------------------------------------------------------------+
//|                                 Function  :         InetToString |
//|                                 Copyright © 2010, XrustSolution. |
//|                                           mail: xrustx@gmail.com |
//+------------------------------------------------------------------+
int InetToString(string fUrl, string &out)
{
Print("URL :",fUrl);
Print("IN DATA",out);
   if(!IsDllsAllowed()){
     Alert("Must be configured to allow the use of DLL");
     return(1001);
   }
   int rv = InternetAttemptConnect(0);
   if(rv != 0){
     Print("Error when calling InternetAttemptConnect ()");
     return(1002);
   }
   int hSession = InternetOpenA(AGENT, INTERNET_OPEN_TYPE_DIRECT, "0", "0", 0);
   if(hSession <= 0){
     Print("Error when calling InternetOpenA()");
     return(1003);         
   }    
        int hReq = InternetOpenUrlA(hSession, fUrl, "0", 0,
                                                                        INTERNET_FLAG_NO_CACHE_WRITE |
                                                                        INTERNET_FLAG_PRAGMA_NOCACHE |
                                                                        INTERNET_FLAG_RELOAD, 0
                                                                        );
   if(hReq <= 0){
     Print("Error when calling InternetOpenUrlA()");
     InternetCloseHandle(hSession);
     return(1004);
   }
   int cBuffer[256];
   ArrayInitialize(cBuffer,0);
   int dwBytesRead[1]; 
   ArrayInitialize(dwBytesRead,0);
   string TXT = "";
   while(!IsStopped()){
        bool bResult = InternetReadFile(hReq, cBuffer, 1024, dwBytesRead);
        if(dwBytesRead[0] == 0)break;
        string text = "";   
        for(int i = 0; i < 256; i++){
                text = text + CharToStr(cBuffer[i] & 0x000000FF);
                        if(StringLen(text) == dwBytesRead[0])break;
                        text = text + CharToStr(cBuffer[i] >> 8 & 0x000000FF);
                        if(StringLen(text) == dwBytesRead[0])break;
                text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);
                if(StringLen(text) == dwBytesRead[0])break;
                text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);
                if(StringLen(text) == dwBytesRead[0])break;
                }
        TXT = TXT + text;
        Sleep(1);
        }
   if(StringFind(TXT,"<html>",0)>=0||StringFind(TXT,"<HTML>",0)>=0||StringFind(TXT,"<title>",0)>=0||StringFind(TXT,"<head>",0)>=0){
        if(StringFind(TXT,">404",0)>=0){return(404);}
   }  
   out = TXT;  
        InternetCloseHandle(hReq);
        InternetCloseHandle(hSession);  
        //Print("ServerAnswer:",out);                                                                           
        return(0);         
}
zoritch
4329
zoritch 2014.03.02 18:53  
InternetOpenUrlW()
Vitalie Postolache
11111
Vitalie Postolache 2014.03.02 18:53  
В конце строковых обращений вместо А ставить W. UNICODE RULEZZZ!!!
Grigoriy Malychenko
3161
Grigoriy Malychenko 2014.03.02 19:34  

Переименовал в #import "wininet.dll" и в функции InetToString()

Теперь Error when calling InternetOpenUrlW() пишет...

компилятор выдает предупреждение truncation of constant value ***.mq4 165 121 ссылаясь на эту строку, может быть, проблема где-то здесь, в константах?

        int hReq = InternetOpenUrlW(hSession, fUrl, "0", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);
Комбинатор
15650
Комбинатор 2014.03.02 19:48  
WebProger:

компилятор выдает предупреждение truncation of constant value ***.mq4 165 121 ссылаясь на эту строку, может быть, проблема где-то здесь, в константах?

Вместо

#define INTERNET_FLAG_RELOAD            0x80000000

Надо

const uint INTERNET_FLAG_RELOAD = 0x80000000;

Тогда все будет ок.

Grigoriy Malychenko
3161
Grigoriy Malychenko 2014.03.02 20:00  
Спасибо, предупреждение в компиляторе исчезло но InternetOpenUrlW() так и выдает ошибку.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий