А что возвращает GetLastError?
Который стандартный MQL4-шный - 0.
Ну подскажите же кто нибудь???
У вас там ошибки на каждом шагу. Трудно даже комментировать.
Вот вам рабочий пример чтения страницы сайта, разберитесь с этим примером,
а потом исправьте все в своем коде, сделайте аналогично примеру.
#import "wininet.dll" int InternetOpenW( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags ); int InternetOpenUrlW( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext ); int InternetReadFile( int hFile, uchar& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] ); int InternetCloseHandle( int hInet ); int InternetQueryDataAvailable( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext ); int HttpQueryInfoW(int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] ); #import #import "Kernel32.dll" uint GetLastError(void); #import #define HTTP_QUERY_CONTENT_LENGTH 0x00000005 #define HTTP_QUERY_FLAG_NUMBER 0x20000000 #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 //+---------------------------------------------------------------------------+ int ReadSitePage(string ps_FileName) // out : gs_HtmlString is fille { if (!gs_UrlPage) { return ERROR_INVALID_PARAMETER; } gs_HtmlString = ""; int hSession = InternetOpenW(AGENT, INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0); if (hSession <= 0) return(Kernel32::GetLastError()); // INTERNET_OPENW_ERROR int lReturn[1]; uchar Buffer[]; int AvailableData; int handle; int Error = 0; bool Result; int hReq = InternetOpenUrlW(hSession, gs_UrlPage, "", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0); // uint ui_Flag = 0x04000000 | 0x00000100 | 0x80000000; if (hReq == 0) { Error = Kernel32::GetLastError(); InternetCloseHandle(hSession); return(Error); // INTERNET_OPENURLW_ERROR } while (true) { AvailableData = GetDataAvailable(hReq, Result); if (!Result) { Error = AvailableData; // INTERNET_QUERYDATAAVAILABLE_ERROR break; } if (AvailableData == 0) break; ArrayResize(Buffer, AvailableData); Result = InternetReadFile(hReq, Buffer, AvailableData, lReturn); if (!Result) { Error = Kernel32::GetLastError(); // INTERNET_READFILE_ERROR; break; } if (lReturn[0] == 0) break; StringAdd(gs_HtmlString, CharArrayToString(Buffer, 0, lReturn[0])); Comment("HTML Page Read = " ,StringLen(gs_HtmlString)); } InternetCloseHandle(hSession); InternetCloseHandle(hReq); if (ps_FileName) { int i_TotalLen = StringLen(gs_HtmlString); ArrayResize(Buffer, i_TotalLen); StringToCharArray(gs_HtmlString, Buffer, 0, i_TotalLen); handle = FileOpen(ps_FileName, FILE_BIN|FILE_WRITE); FileWriteArray(handle, Buffer, 0, i_TotalLen); FileClose(handle); } return(Error); } //+--------------------------------------------------------------------------------------+ int GetDataAvailable(int hRequest, bool& Res ) { int Buffer[1]; Res = InternetQueryDataAvailable(hRequest, Buffer, 0, 0); if (Res) return(Buffer[0]); return(Kernel32::GetLastError()); // INTERNET_QUERYDATAAVAILABLE_ERROR } string gs_UrlPage = "https://forum.mql4.com/ru/36699/page2"; string gs_HtmlString; int init() { int i_Error = ReadSitePage("Page.html") Print("ReadSitePage(...) return = ", i_Error); }
Если код возврата равен 0, в папке Files терминала появится файл Page.html, который вы сможете посмотреть.
У вас там ошибки на каждом шагу. Трудно даже комментировать.
Вот вам рабочий пример чтения страницы сайта, разберитесь с этим примером,
а потом исправьте все в своем коде, сделайте аналогично примеру.
Если код возврата равен 0, в папке Files терминала появится файл Page.html, который вы сможете посмотреть.
Дело в том, что GET запрос я и сам могу сделать. Мне нужна именно отправка данных через POST и получение ответа. С этим-то и есть проблема.
Дело в том, что GET запрос я и сам могу сделать. Мне нужна именно отправка данных через POST и получение ответа. С этим-то и есть проблема.
Ладно, пусть так. Вот здесь https://www.mql5.com/ru/articles/276 статья нашего модератора Sergeeva, все разложено по полочкам, но только там классы и все такое...
Ладно, пусть так. Вот здесь https://www.mql5.com/ru/articles/276 статья нашего модератора Sergeeva, все разложено по полочкам, но только там классы и все такое...
Да. Я читал эту статью. С классами я работать умею. А MQL4 это может использовать?
И насчет моего кода. Укажите хотя бы на одну ошибку пожалуйста. Я вот не вижу.
Да. Я читал эту статью. С классами я работать умею. А MQL4 это может использовать?
И насчет моего кода. Укажите хотя бы на одну ошибку пожалуйста. Я вот не вижу.
c 600 билда и выше, можно. по ошибкам, к примеру функция InternetReadFile(...)
Вот у меня
int InternetReadFile (int hFile, uchar& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );
вот у вас
int InternetReadFile (uint horHandle, string response, uint responseLength, uint offset);
Второй параметр - адрес, по которому функция будет писаться данные. для билда 509 и ниже у вас все правильно,
для билда 600 и выше вы получите в строковой переменной Response все прочитанные данные, но чтобы ими воспользоваться
нужно еще потрудиться, поскольку в новом билде один символ строки - это два байта.
А вот вы читаете:
string buffer;
bool irf = InternetReadFile(hor, buffer, 128, NULL);
Третий параметр говорит функции сколько байт надо прочитать - 128 у вас, а откуда вы знаете, что вообще есть данные для чтения ?
Четвертый параметр - это адрес DWORD куда функция пишет количество реально прочитанных байт, у вас там вообще стоит NULL !
Вот полное описание этой функции:
BOOL InternetReadFile( _In_ HINTERNET hFile, _Out_ LPVOID lpBuffer, _In_ DWORD dwNumberOfBytesToRead, _Out_ LPDWORD lpdwNumberOfBytesRead );
Parameters
hFile [in]Handle returned from a previous call to InternetOpenUrl, FtpOpenFile, or HttpOpenRequest.
lpBuffer [out]Pointer to a buffer that receives the data.
dwNumberOfBytesToRead [in]Number of bytes to be read.
lpdwNumberOfBytesRead [out]Pointer to a variable that receives the number of bytes read. InternetReadFile sets this value to zero before doing any work or error checking.
А вот ссылка, как она работает:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa385103(v=vs.85).aspx
c 600 билда и выше, можно. по ошибкам, к примеру функция InternetReadFile(...)
Вот у меня
int InternetReadFile (int hFile, uchar& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );
вот у вас
int InternetReadFile (uint horHandle, string response, uint responseLength, uint offset);
Второй параметр - адрес, по которому функция будет писаться данные. для билда 509 и ниже у вас все правильно,
для билда 600 и выше вы получите в строковой переменной Response все прочитанные данные, но чтобы ими воспользоваться
нужно еще потрудиться, поскольку в новом билде один символ строки - это два байта.
А вот вы читаете:
string buffer;
Третий параметр говорит функции сколько байт надо прочитать - 128 у вас, а откуда вы знаете, что вообще есть данные для чтения ?
Четвертый параметр - это адрес DWORD куда функция пишет количество реально прочитанных байт, у вас там вообще стоит NULL !
Вот полное описание этой функции:
Parameters
hFile [in]Handle returned from a previous call to InternetOpenUrl, FtpOpenFile, or HttpOpenRequest.
lpBuffer [out]Pointer to a buffer that receives the data.
dwNumberOfBytesToRead [in]Number of bytes to be read.
lpdwNumberOfBytesRead [out]Pointer to a variable that receives the number of bytes read. InternetReadFile sets this value to zero before doing any work or error checking.
А вот ссылка, как она работает:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa385103(v=vs.85).aspx
Спасибо за описание ошибок этой функции. Но вы наверно заметили, что до этой функции мы еще даже не добираемся. Ошибка возникает на стадии HttpSendRequest. Она возвращает в хандлер 0.
А GetLastError говорит что ошибка номер 2, что означает COMMON_ERROR. Совершенно неинформативно.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Пытаюсь отправить данные методом POST, и на стадии HttpSendRequestW получаю 0.
Вот мой код.
Домен изменен.
Подскажите пожалуйста, где я ошибаюсь?