Вопрос по отправке файла

 

если использовать библиотеку wininet.dll, то можно получать файлы из инета.

А есть ли какой то способ, чтоб отправить файл?

накопал через гугл 4 метода для веб-программирования метод POST, curl, ajax и врапперы. 

Но как это всё прикрутить для MQL не знаю....

Может кто подскажет или направит где почитать.

Я так понимаю, надо dll, из которой импортнуть функции как на подобии из wininet.dll.

Заранее благодарю за любую помощь.

 
sergeev писал(а) >>

если использовать библиотеку wininit.dll, то можно получать файлы из инета.

А есть ли какой то способ, чтоб отправить файл?

накопал через гугл 4 метода для веб-программирования метод POST, curl, ajax и врапперы.

Но как это всё прикрутить для MQL не знаю....

Может кто подскажет или направит где почитать.

Я так понимаю, надо dll, из которой импортнуть функции как на подобии из wininet.dll.

Заранее благодарю за любую помощь.

Если ложить на ФТП, то уже все есть.

 

Сначало - не wininit.dll, а wininet.dll.

Да и потом - а чем https://docs.mql4.com/ru/common/SendFTP вам не нравиться?

 
Itso >>:

Да и потом - а чем https://docs.mql4.com/ru/common/SendFTP вам не нравиться?


просто терминал не знает пароли на ftp сервер.

надо просто его передать. метод get работает, но файлы большие передавать напряжно (можно, но напряжно).

хотя может я и ошибаюсь и wininet вполне достаточно для отправки... может кто подскажет
 

вроде нашёл функция HttpSendRequest

http://msdn.microsoft.com/en-us/library/aa384247(VS.85).aspx

и тут немного http://www.rsdn.ru/article/inet/wininet.xml#EVJAC

осталось разобратся как ей пользоватся. :) у кого нибудь есть наработки?


http://programmersforum.ru/showthread.php?t=14798

 

но появился новый вопрос: в функцию 

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

 
sergeev >>:


но появился новый вопрос: в функцию


в параметр 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

 
как задать WORD - 2 байта?
 
а где там WORD? я вижу только DWORD
 

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);
}
//+------------------------------------------------------------------+
Файлы:
text.txt  1 kb
recieve.txt  1 kb
_sendfile.mq4  4 kb
Причина обращения: