если использовать библиотеку wininit.dll, то можно получать файлы из инета.
А есть ли какой то способ, чтоб отправить файл?
накопал через гугл 4 метода для веб-программирования метод POST, curl, ajax и врапперы.
Но как это всё прикрутить для MQL не знаю....
Может кто подскажет или направит где почитать.
Я так понимаю, надо dll, из которой импортнуть функции как на подобии из wininet.dll.
Заранее благодарю за любую помощь.
Если ложить на ФТП, то уже все есть.
Сначало - не wininit.dll, а wininet.dll.
Да и потом - а чем https://docs.mql4.com/ru/common/SendFTP вам не нравиться?
просто терминал не знает пароли на ftp сервер.
надо просто его передать. метод get работает, но файлы большие передавать напряжно (можно, но напряжно).
вроде нашёл функция HttpSendRequest
http://msdn.microsoft.com/en-us/library/aa384247(VS.85).aspx
и тут немного http://www.rsdn.ru/article/inet/wininet.xml#EVJAC
осталось разобратся как ей пользоватся. :) у кого нибудь есть наработки?
но появился новый вопрос: в функцию
BOOL HttpSendRequest( __in HINTERNET hRequest, __in LPCTSTR lpszHeaders, __in DWORD dwHeadersLength, __in LPVOID lpOptional, __in DWORD dwOptionalLength );
в параметр lpOptional нужно передать указатель на загруженный в память файл.
вот как делано в том примере на паскале
Result:PChar;
Result:=VirtualAlloc(nil, dwSize, MEM_COMMIT, PAGE_READWRITE); // выделяем объём памяти dwSize
ReadFile(hFile, Result^, dwSize, dwBytes, nil); // читаем файл в выделенную память
и затем вызываем функцию (пишу сокращённо, но смысл понятен)
hResourceHandle:=HttpOpenRequest(hConnectHandle, 'POST', PathToHost, nil, nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);
HttpSendRequest(hResourceHandle, 'Content-Type: application/x-www-form-urlencoded', 47, Result, dwSize);
/
так вот вопрос такой - как в MQL выделить требуемый объём памяти для переменной?
появляется предчуствие, что только масивами... по аналогии как сделано у Дмитрия https://www.mql5.com/ru/code/7089
но появился новый вопрос: в функцию
в параметр lpOptional нужно передать указатель на загруженный в память файл.
вот как делано в том примере на паскале
Result:PChar;
Result:=VirtualAlloc(nil, dwSize, MEM_COMMIT, PAGE_READWRITE); // выделяем объём памяти dwSize
ReadFile(hFile, Result^, dwSize, dwBytes, nil); // читаем файл в выделенную память
и затем вызываем функцию (пишу сокращённо, но смысл понятен)
hResourceHandle:=HttpOpenRequest(hConnectHandle, 'POST', PathToHost, nil, nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);
HttpSendRequest(hResourceHandle, 'Content-Type: application/x-www-form-urlencoded', 47, Result, dwSize);
/
так вот вопрос такой - как в MQL выделить требуемый объём памяти для переменной?
появляется предчуствие, что только масивами... по аналогии как сделано у Дмитрия https://www.mql5.com/ru/code/7089
ну да, выделяйте массивом, а потом передавайте его (по ссылке) в HttpSendRrequest
HINTERNET InternetConnect(
__in HINTERNET hInternet,
__in LPCTSTR lpszServerName,
__in INTERNET_PORT nServerPort,
__in LPCTSTR lpszUsername,
__in LPCTSTR lpszPassword,
__in DWORD dwService,
__in DWORD dwFlags,
__in DWORD_PTR dwContext
);
в описании wininet.h http://doc.ddart.net/msdn/header/include/wininet.h.html
INTERNET_PORT это WORD
-----------------
в MQL есть SHORT_VALUE. но не преобразовывается
в атаче
text.txt - файл, который хочу отправить со строкой заголовка
recieve.txt - переименовать в php - на сервер сохранение файла
и скрипт отправки
привожу также тут:
//+------------------------------------------------------------------+ //| SendFile.mq4 | //| | //| | //+------------------------------------------------------------------+ #import "wininet.dll" int InternetAttemptConnect(int x); int InternetOpenA(string sAgent, int lAccessType, string sProxyName="", string sProxyBypass="", int lFlags = 0); int InternetConnectA(int hInternet, string lpszServerName, /*WORD*/ int nServerPort, string lpszUsername, string lpszPassword, int dwService, int dwFlags, int dwContext); int HttpOpenRequestA(int hConnect, string lpszVerb, string lpszObjectName, string lpszVersion, string lpszReferer, string lplpszAcceptTypes, int dwFlags, int dwContext); int HttpSendRequestA(int hRequest, string lpszHeaders, int dwHeadersLength, int& lpOptional[], int dwOptionalLength); int InternetCloseHandle(int hInet); #import #define INTERNET_OPEN_TYPE_PRECONFIG 0 // use registry configuration #define INTERNET_FLAG_KEEP_CONNECTION 0x00400000 // use keep-alive semantics #define INTERNET_SERVICE_HTTP 3 //HINTERNET int //BOOL int //LPVOID int& [] //DWORD int //WORD int ??????? //LPDWORD int& [1] //DWORD_PTR int //LPCTSTR string //LPCTSTR * string //+------------------------------------------------------------------+ int start() { string Host="http://localhost"; string Path="http://localhost/recieve.php"; // читаем данные int h=FileOpen("text.txt", FILE_BIN|FILE_READ); if (h<0) return; FileSeek(h, 0, SEEK_SET); int size=MathFloor(FileSize(h)/4); int data[], i=0; ArrayResize(data, size); // изменили размер while (!FileIsEnding(h)) { data[i]=FileReadInteger(h, LONG_VALUE); i++; } FileClose(h); // // выводим прочитанный массив для проверки string st=""; for (i=0; i<size; i++) { st=st+CharToStr(data[i]&255); st=st+CharToStr(data[i]>>8&255); st=st+CharToStr(data[i]>>16&255); st=st+CharToStr(data[i]>>24&255); } Print("Размер файла: "+size*4+" байт"); Print("Данные: "+st); int hInternetSession, hConnectHandle, hResourceHandle, result; if(InternetAttemptConnect(0)!=0) { Print("error InternetAttemptConnect"); return(0); } hInternetSession=InternetOpenA("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0); if (hInternetSession<=0) { Print("error InternetOpenA()"); return(0); } hConnectHandle=InternetConnectA(hInternetSession, Host, 80, "", "", INTERNET_SERVICE_HTTP, 0, 0); if (hConnectHandle<=0) { Print("error InternetConnect()"); return(0); } hResourceHandle=HttpOpenRequestA(hConnectHandle, "POST", Path, "", "", "", INTERNET_FLAG_KEEP_CONNECTION, 0); if (hResourceHandle<=0) { Print("error HttpOpenRequest()"); return(0); } result=HttpSendRequestA(hResourceHandle, "Content-Type: application/x-www-form-urlencoded", 47, data, size); if (result<=0) { Print("error HttpSendRequestA()"); return(0); } InternetCloseHandle(hResourceHandle); InternetCloseHandle(hConnectHandle); InternetCloseHandle(hInternetSession); } //+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
если использовать библиотеку wininet.dll, то можно получать файлы из инета.
А есть ли какой то способ, чтоб отправить файл?
накопал через гугл 4 метода для веб-программирования метод POST, curl, ajax и врапперы.
Но как это всё прикрутить для MQL не знаю....
Может кто подскажет или направит где почитать.
Я так понимаю, надо dll, из которой импортнуть функции как на подобии из wininet.dll.
Заранее благодарю за любую помощь.