Скачать MetaTrader 5

По FTP получаю реквизиты файлов/каталогов на сервере, в буфере вместе с именем мусор, как избавится?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Александр
1058
Александр  

Вот скрипт, который получает данные. Не могу избавится от мусора в буфере, мусор дописывается к имени файла/каталога. Что делаю не так, подскажите.

#define INTERNET_SERVICE_FTP            1 
#define INTERNET_FLAG_RELOAD            0x80000000
#define INTERNET_FLAG_NO_CACHE_WRITE    0x04000000
#define INTERNET_FLAG_PRAGMA_NOCACHE    0x00000100

#import "ntdll.dll"
 int RtlGetLastWin32Error();
 int RtlSetLastWin32Error (int dwErrCode);
#import
#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 szServerName,int nServerPort,string lpszUsername,string lpszPassword,int dwService,int dwFlags,int dwContext);
int FtpFindFirstFileA(int hInternet, string sPath, int& sBuffer[], int lFlags, int lContext);
bool InternetFindNextFileA(int hFind, int& sBuffer[]);
bool InternetCloseHandle(int hFind);
//#import   



//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
   int hsession,hconnect,hfind,win32data[80];
//=============================================
   RtlSetLastWin32Error(0);
   if(InternetAttemptConnect(0)!=0) {
      Print("Error AttemptConnect: ",RtlGetLastWin32Error());
      return;
   }
   hsession=InternetOpenA("Microsoft Internet Explorer",0,"","",0);
   if(hsession<=0) {
      Print("Error Open: ",RtlGetLastWin32Error());
      return;
   }
   hconnect=InternetConnectA(hsession,"ftp.san.ru",21,"anonymous","",INTERNET_SERVICE_FTP,0,0);
   if(hconnect<=0) {
      Print("Error Connect: ",RtlGetLastWin32Error());
      return;
   }
   ArrayInitialize(win32data,0);
   hfind=FtpFindFirstFileA(hconnect,"*.*",win32data,INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD,0);
   if(hfind<=0) {
      Print("Error FindFirstFile: ",RtlGetLastWin32Error());
      return;
   }
   Print(bufferToString(win32data));
   ArrayInitialize(win32data,0);
   while(InternetFindNextFileA(hfind,win32data)) {
      Print(bufferToString(win32data));
      ArrayInitialize(win32data,0);
   }
   InternetCloseHandle(hfind);
   InternetCloseHandle(hconnect);
   InternetCloseHandle(hsession);
   return;
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  считать текст из буфера                                         |
//+------------------------------------------------------------------+ 
string bufferToString(int buffer[])
   {
   string text="";
   
   int pos = 10;
   for (int i=0; i<64; i++)
      {
      pos++;
      int curr = buffer[pos];
      text = text + CharToStr(curr & 0x000000FF)
                  + CharToStr(curr >> 8 & 0x000000FF)
                  + CharToStr(curr >> 16 & 0x000000FF)
                  + CharToStr(curr >> 24 & 0x000000FF);
      }
   return (text);
   }
//+------------------------------------------------------------------+

Картинка с ftp сервера


А вот что в логе:

01:00:47 s-test EURUSD,M5: loaded successfully
01:00:49 s-test EURUSD,M5: IPTVлЋvИejяяяяяяяя?`к Р?АШ^,и^,X“Ђ
^хyыЉа?WюьА^,
01:00:49 s-test EURUSD,M5: docsqІГЂ%AN Miniport (IKEv2)
01:00:49 s-test EURUSD,M5: favicon.icoVІГЂHAN Miniport (IKEv2)
01:00:49 s-test EURUSD,M5: games+ІГЂkAN Miniport (L2TP)
01:00:49 s-test EURUSD,M5: index.htmls\Meta нІГaЂ±A
01:00:49 s-test EURUSD,M5: robots.txt-test.mВІГ"ЂWAN Miniport (PPTP)
01:00:49 s-test EURUSD,M5: tempAppData§ІГoЂ=ingCommonProgramFiles=C:\Program Files\Common FilesCOђІГUЂdRNAME
01:00:49 s-test EURUSD,M5: unixxeEMAIL=D:\mailFP_NO_„ІГSЂ`CHECK=NOHOMEDRIVE=C:HOMEPATH=\Users\AlexLOCALAPPDATA=C:\Users\Alex\AppData\LocalLOGONSERVER=\
01:00:49 s-test EURUSD,M5: windowsNTPat]іГCЂџWindows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files
01:00:49 s-test EURUSD,M5: uninit reason 0
01:00:49 s-test EURUSD,M5: removed

Алексей Тарабанов
7329
Алексей Тарабанов  
Инициализировать все статическое.
Александр
1058
Александр  
tara:
Инициализировать все статическое.

А подробней можно или пример.
Alexey Subbotin
4998
Alexey Subbotin  
Проблема с тем, что WIN32_FIND_DATA должен измеряться в байтах, а вы его измеряете в int'ах (из которых каждый по 4 байта:)
Андрей
1890
Андрей  
Блин. Ну видно же, что все строчки нормальные- просто не взята подстрока.
Типа дает система строку "ААА", а буфер длиной 100.
3 символа значимое- остальное мусор.
Если нуль так и не встретится- то при печати будет крэш.
Alexey Subbotin
4998
Alexey Subbotin  

На всякий случай, проверьте все смещения

typedef struct _WIN32_FIND_DATA {
  DWORD    dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD    nFileSizeHigh;
  DWORD    nFileSizeLow;
  DWORD    dwReserved0;
  DWORD    dwReserved1;
  TCHAR    cFileName[MAX_PATH];
  TCHAR    cAlternateFileName[14];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
Alexey Subbotin
4998
Alexey Subbotin  

А может, просто все дело в скобках?

text = text + CharToStr(curr & 0x000000FF)
                  + CharToStr((curr >> 8) & 0x000000FF)
                  + CharToStr((curr >> 16) & 0x000000FF)
                  + CharToStr((curr >> 24) & 0x000000FF);
Александр
1058
Александр  
alsu:
Проблема с тем, что WIN32_FIND_DATA должен измеряться в байтах, а вы его измеряете в int'ах (из которых каждый по 4 байта:)

По этому поводу есть статья, придерживался ее - https://www.mql5.com/ru/articles/1543
Александр
1058
Александр  
alsu:

А может, просто все дело в скобках?


Спасибо, помогло!

P.S. Поспешил, не помогло. Некоторые остались с мусором, некоторые стали без.

Александр
1058
Александр  
jartmailru:
Блин. Ну видно же, что все строчки нормальные- просто не взята подстрока.
Типа дает система строку "ААА", а буфер длиной 100.
3 символа значимое- остальное мусор.
Если нуль так и не встретится- то при печати будет крэш.

А как в mql4 сформировать строку с нулем на конце?
Андрей
1890
Андрей  
Talex:
А как в mql4 сформировать строку с нулем на конце?
Формировать строку с нулем на конце в mql4 (впрочем как и в С++ / std::string)- не ваша задача.
Надо просто подстроку взять с нужным количеством символов.
Хм... только вопрос- почему нуля нет в исходной строке? Или он там есть все же.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий