HttpSendRequest

 

Подскажите, пжлста. Сколько не искал - не могу найти рабочий вариант.

Пытаюсь организовать отправку информации на сайт через HttpSendRequest из wininet.dll

Часть кода:

int hInternet = InternetOpenUrlW(hSession(), Url2, "", 0, 
                                INTERNET_FLAG_PRAGMA_NOCACHE | 
                                INTERNET_FLAG_RELOAD | INTERNET_SERVICE_HTTP, 0);                          
  if (hInternet == 0) 
        return;    
   Print("hInternet =  ", hInternet);
   
  string Host="http://******.com";
  string Path="http://*****.com/signal.php"; 
  
  int Connect = InternetConnectW(hSession(),Host,80,"","",INTERNET_SERVICE_HTTP,0,0);
  Print("Connect =  ",Connect);   
 
  string Vers="HTTP/1.1";
 
  int Resurs = HttpOpenRequestW(Connect,"POST",Path,Vers,"","",INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE,0);
  Print("Resurs=  ",Resurs);

  string send = "name=1211";
  uchar data[];
 
  StringToCharArray(send,data,0,0,CP_ACP);
  string head="Content-Type: application/x-www-form-urlencoded";
  
  
  int result = HttpSendRequestW(Resurs, head,StringLen(head),data,ArraySize(data)-1);
  Print("Result = ",result);
  
   InternetCloseHandle(Resurs);
        InternetCloseHandle(Connect);
        InternetCloseHandle(hInternet);

Компилятор ругается на  'data' - parameter conversion not allowed

Если меняю data на переменную string, то компилятор не ругается, но советник не отправляет никаких данных и int result=0

 
А WebRequest чем не подходит?
 
Stanislav Korotky:
А WebRequest чем не подходит?

в том и дело что он не подходит мне

 
int HttpGET(string strUrl, string& page, int timeout = -1)
{
   int hSession = InternetOpenW(AGENT, 0, "", "", 0);

   RtlSetLastWin32Error(0);
   
   if (timeout > 0)
   {
         int option[] = {0};
         option[0] = timeout;
         InternetSetOptionW(hSession, INTERNET_OPTION_CONNECT_TIMEOUT, option, 4);
   }

   int hURL = InternetOpenUrlW(
         hSession, strUrl, "", 0,
         INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

   if (hURL == 0) 
   {
      int err = RtlGetLastWin32Error();
      Print("InternetOpenUrl failed with error = ", err);
      InternetCloseHandle(hSession);
      return (err);
   }

   int pRead[] = {0};
   uchar buffer[200];
   int size = ArraySize(buffer);

   while (true)
   {
      if (InternetReadFile(hURL, buffer, size, pRead) <= 0 || pRead[0] == 0) 
      {
         break;
      }
      string sBuffer = CharArrayToString(buffer);
      StringAdd(page, StringSubstr(sBuffer, 0, pRead[0]));
   }

   InternetCloseHandle(hURL);
   InternetCloseHandle(hSession);

   return (0);
}

Импорт:

const uint INTERNET_FLAG_KEEP_CONNECTION   = 0x00400000;
const uint INTERNET_FLAG_NO_AUTO_REDIRECT  = 0x00200000;
const uint INTERNET_FLAG_NO_COOKIES        = 0x00080000;
const uint INTERNET_FLAG_RELOAD            = 0x80000000;
const uint INTERNET_FLAG_NO_CACHE_WRITE    = 0x04000000;
const uint INTERNET_FLAG_DONT_CACHE        = 0x04000000;
const uint INTERNET_FLAG_PRAGMA_NOCACHE    = 0x00000100;
const uint INTERNET_FLAG_NO_UI             = 0x00000200;

#define INTERNET_OPTION_CONNECT_TIMEOUT 2

#define AGENT                           "any agent you need"

#import "ntdll.dll"
   int RtlGetLastWin32Error();
   int RtlSetLastWin32Error (int dwErrCode);

#import "wininet.dll"
   int InternetOpenW(string sAgent, int lAccessType, string sProxyName = "", string sProxyBypass = "", int lFlags = 0);
   int InternetOpenUrlW(int hInternetSession, string sUrl, string sHeaders = "", int lHeadersLength = 0, int lFlags = 0, int lContext = 0);
   int InternetReadFile(int hFile, uchar& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]);
   int InternetCloseHandle(int hInet);
   int InternetSetOptionW(int hInternet, int dwOption, int& lpBuffer[], int dwBufferLength);
#import
Это для 4ки, для 5ки все хендлы и указатели надо делать 8-байтными
 
denbrown2003:

Подскажите, пжлста. Сколько не искал - не могу найти рабочий вариант.

Пытаюсь организовать отправку информации на сайт через HttpSendRequest из winapi.dll

Часть кода:

Компилятор ругается на  'data' - parameter conversion not allowed

Если меняю data на переменную string, то компилятор не ругается, но советник не отправляет никаких данных и int result=0


А если сделать data статическим масивом с заданным размером? В MSDN пишут, он должен быть типа LPVOID, то есть int*

Может из-за динамического массива проблемы.

 

denbrown2003:

Часть кода:

Компилятор ругается на  'data' - parameter conversion not allowed

Сорри, не посмотрел что post.

Надо импорт шапка кроме того кода что вы выложили

 
denbrown2003:

в том и дело что он не подходит мне

Из приведенного кода не совсем понятно, чем не подходит? Открыли, положили, закрыли. Все обычно.

 
Stanislav Korotky:

Из приведенного кода не совсем понятно, чем не подходит? Открыли, положили, закрыли. Все обычно.

необходимо именно через wininet

 
denbrown2003:

необходимо именно через wininet

 Если https, то порт нужно использовать 443

 
Stanislav Korotky:
А WebRequest чем не подходит?

Не работает в индикаторах, что не совсем логично

 
Vitaly Muzichenko:

Не работает в индикаторах, что не совсем логично

Это хотя бы понятно, почему так сделано. Если MQ когда-нибудь дойдет до того, чтобы каждому индикатору выделить собственный поток, то может и функцию разрешат.

PS. Действительно при переводе кое-каких индюков на МТ5 пришлось закачку выделить в отдельный эксперт, а индюки читают скачанные данные из файла.

Причина обращения: