Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пиши статьи, помогай другим разработчикам и зарабатывай
nys2000
133
nys2000 2016.02.24 17:28 

Есть необходимость чтения данных из удаленного текстового файла.

Использую следующий код:

#import  "Wininet.dll"

int InternetOpenW(string sAgent,int lAccessType,string sProxyName,string sProxyBypass,int lFlags);

int InternetConnectW(int hInternet,string szServerName,int nServerPort,string lpszUsername,string lpszPassword,int dwService,int dwFlags,int dwContext);

int HttpOpenRequestW(int hConnect,string Verb,string ObjectName,string Version,string Referer,char &AcceptTypes[],uint dwFlags,int dwContext);

int InternetReadFile(int hFile,uchar &sBuffer[],int lNumBytesToRead,int &lNumberOfBytesRead);

int InternetCloseHandle(int); 

#import

#import "kernel32.dll"

int GetLastError(void);

#import

int OnInit()

  {

string Types = "";

char acceptTypes[];

int rBytes;

StringToCharArray(Types, acceptTypes);

uchar ch[100];



int HttpOpen = InternetOpenW(" ", 0, " ", "", 0);  

int HttpConnect = InternetConnectW(HttpOpen, "www.nys2000.cc.ua", 80, "", "", 3, 0, 0);

int HttpRequest = HttpOpenRequestW(HttpConnect, "GET", "/http/data.txt", "", "", acceptTypes, 0, 0);   

if (InternetReadFile(HttpRequest,ch,100,rBytes)==true)

   Print("Sucsessfull==", rBytes);

else

   Print("Error");

Print ("Last MSDN Error =: ", kernel32::GetLastError());

   InternetCloseHandle(HttpOpen);

   InternetCloseHandle(HttpConnect);

   InternetCloseHandle(HttpRequest);   


   return(INIT_SUCCEEDED);

  }


void OnTick()

  {
  }


При выполнении InternetReadFile() всегда возвращает true, даже если файл не существует(???).

При этом значение rBytes - фактически считанное из файла количество байт - всегда 0, т.е. данные не считываются.

Не могу понять сочетания "успешного" выполнения функции InternetReadFile() и нулевого количества считанных данных.

Vladimir
212
Vladimir 2016.02.27 01:49  
nys2000:

Есть необходимость чтения данных из удаленного текстового файла.

Использую следующий код:


При выполнении InternetReadFile() всегда возвращает true, даже если файл не существует(???).

При этом значение rBytes - фактически считанное из файла количество байт - всегда 0, т.е. данные не считываются.

Не могу понять сочетания "успешного" выполнения функции InternetReadFile() и нулевого количества считанных данных.

По последнему сочетанию в https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa385103(v=vs.85).aspx прямо написано, что таким способом устанавливается факт выхода указателя в файле на (за) конец файла:

"To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero."

Перевод Гугл: Для того, чтобы гарантировать, что все данные будут извлекаться, приложение должно продолжать вызывать функцию InternetReadFile, пока функция не возвращает значение TRUE и низкое число параметра Bytes Read равно нулю.


По поводу всегда нулевого rbytes я бы озаботился типом этого целого. В DLL требуется беззнаковый, объявлен знаковый. Надо и длины типов сравнить.

По поводу всегда true, даже если файл не существует. Тут, по-моему, надо отвыкать от слова файл. Вместо файла на том конце созданного HTTP канала могут находиться параметры поискового запроса, и в канал постепенно забрасываются данные, иногда он бывает пуст, затем что-нибудь появится. Но cам канал отрабатывает успешно, true лишь говорит, что добраться до той стороны канала и передать то, что нужно, удалось корректно.

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