스크립트: WININET_TEST

 

WININET_TEST:

다음은 wininet.dll 라이브러리를 사용하여 인터넷에서 페이지(파일)를 다운로드하는 방법을 보여주는 간단한 예입니다.

WININET_TEST

작성자: MetaQuotes

 

파일을 읽기 전에 파일의 길이를 알 수 있는지 알려주실 수 있나요? 이는 용량이 크고 속도가 느린 경우 로드된 데이터의 비율을 추정할 수 있도록 하기 위한 것입니다.

 
gdtt:

파일을 읽기 전에 파일의 길이를 알 수 있는지 알려주실 수 있나요? 이는 대용량, 느린 속도의 경우 다운로드된 데이터의 비율을 추정할 수 있도록 하기 위한 것입니다.

가능하다고 생각하며 wininet.dll의 msdn 설명에서 찾을 수 있습니다.

 
gdtt:

파일을 읽기 전에 파일의 길이를 알 수 있는지 알려주실 수 있나요? 용량이 크고 속도가 느린 경우 로드된 데이터의 비율을 추정할 수 있도록 하기 위해서입니다.

GET 요청 전에 /HEAD 보내기
 
sergeev:

할 수 있다고 생각하며 wininet.dll의 msdn 설명에서 찾을 수 있습니다.


wininet.dll 사용법을 완전히 공개하는 것이 좋은 주제가 될 것 같습니다.

 
매우 유용한 기사가 될 것입니다.
 
gdtt:

파일을 읽기 전에 파일의 길이를 알 수 있는지 알려주실 수 있나요? 용량이 크고 속도가 느린 경우 다운로드된 데이터의 비율을 추정할 수 있도록 하기 위한 것입니다.

서버가 콘텐츠의 길이를 보고하는 경우 가능성이 있습니다.

요청에 대한 정보를 얻으려면 wininet.dll에서 HttpQueryInfo 함수를 사용할 수 있습니다. 이 함수는 필요한 정보를 지정된 배열에 문자열 형식으로 반환합니다.

사용 예

가져오기 섹션에 설명을 추가합니다:

int HttpQueryInfoW(int hRequest,int dwInfoLevel,uchar &lpvBuffer[],int &lpdwBufferLength,int &lpdwIndex);

또한

#define HTTP_QUERY_CONTENT_LENGTH 5

를 추가한 다음 InternetOpenUrlW를 호출하고 hURL을 가져온 후 코드에 코드를 추가해야 합니다:

   int BufLen=2048;
   int ind=0;
   uchar buf0[2048];
   string s="";
   int ContentSize_HttpQueryInfoW=0;
   int iRes;
   
   iRes=HttpQueryInfoW(hURL,HTTP_QUERY_CONTENT_LENGTH,buf0,BufLen,ind);
   if(iRes<=0)
     {
      Print("Error in call of HttpQueryInfoW()");
     }
   else
     {
      s="";
      for(int k=0;k<BufLen;k++) { s=s+CharToString(buf0[k]);}
      Print("HTTP_QUERY_CONTENT_LENGTH:",s);
      if (StringLen(s)>0) ContentSize_HttpQueryInfoW=StringToInteger(s);
      Alert("콘텐츠 크기=",ContentSize_HttpQueryInfoW);
     }     

yandex.ru의 테스트 예제에서는 다운로드한 파일의 크기에 해당하는 "콘텐츠 크기= 44649"를 얻습니다. 즉, 다운로드 시작(InternetReadFile) 전에 콘텐츠의 길이를 알 수 있습니다.

 

현재 버전의 스크립트에 이 기능을 추가했습니다.

 

수고해 주셔서 감사합니다!

완벽하게 작동합니다!

 

실행하려고 하면 메타트레이더가 치명적인 오류와 함께 닫힙니다. 해결책이 있나요?

 
지난 MT5 업데이트 전에는 윈넷이 작동했습니다. 하지만 여전히 다시 작동하는 해결책을 찾을 수 없습니다. 이 문제를 극복하는 방법을 찾으면 알려주세요.