다음은 v600에서 실행되도록 업데이트된 GrabWeb 기능입니다. 이제 InternetOpenW 및 InternetOpenUrlW 및 유니코드 변환을 사용합니다. XML 파일을 정상적으로 가져오지만 파일에는 모두 NULL 데이터가 있습니다. 코드에서 StrWebPage에 대한 Print 문을 참조하십시오. 출력된 데이터를 보면 strThisRead에 유효한 데이터가 있는 동안 쓰레기입니다. 누군가가 보고 수정 사항을 찾을 수 있는지 확인할 수 있습니까? 이 스레드의 수정 사항을 따릅니다.https://www.mql5.com/en/forum/149360
FFCal.mq4에 코드를 복사하여 붙여넣고 v600 MT4로 컴파일하고 실행하십시오(귀하의 버전에 속하지 않는 항목을 편집하여 컴파일하십시오).
bool bWinInetDebug = false ;
#define READURL_BUFFER_SIZE 1000#import "wininet.dll"int InternetOpenW( string , int , string , string , int );
int InternetOpenUrlW( int , string , string , int , int , int );
int InternetReadFile( int , uchar & arr[], int , int & arr[]);
int InternetCloseHandle( int );
#import
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//bool GrabWeb( string strUrl, string & strWebPage)
{
int hInternet;
int hInternetUrl;
bool bSuccess = false ;
// Get an internet handle
hInternet = InternetOpenW( "mt4" , 0/* 0 = INTERNET_OPEN_TYPE_PRECONFIG */ , NULL , NULL , 0 );
if (bWinInetDebug)
Log( "hInternet: " + hInternet);
if (hInternet == 0 )
{
Message = Symbol () + " " + IndicatorName + " Error 890 - Unable to get an Internet Handle!" ;
Print (Message);
Alert (Message);
HealthBuffer[ 0 ] = Error_state;
bSuccess = false ;
}
else
{
// Get a URL handle
hInternetUrl = InternetOpenUrlW(hInternet, NewsURL, NULL , 0 , 0 , 0 );
if (bWinInetDebug)
Log( "hInternetUrl: " + hInternetUrl);
if (hInternetUrl == 0 )
{
Message = Symbol () + " " + IndicatorName + " Error 891 - Unable to get a URL handle!" ;
Print (Message);
Alert (Message);
HealthBuffer[ 0 ] = Error_state;
bSuccess = false ;
}
else
{
Print ( "Reading URL: " + strUrl);
bool bKeepReading = true ;
while (bKeepReading)
{
int lReturn[ 1 ];
uchar arrReceive[];
ArrayResize (arrReceive, READURL_BUFFER_SIZE + 1 );
int success = InternetReadFile(hInternetUrl, arrReceive, READURL_BUFFER_SIZE, lReturn);
if (success == 0 )
{
Message = Symbol () + " " + IndicatorName + " Error 892 - Unable to read News Database WebPage!" ;
Print (Message);
Alert (Message);
HealthBuffer[ 0 ] = Error_state;
bKeepReading = false ;
bSuccess = false ;
}
else
{
if (bWinInetDebug)
Log( "success: " + success);
if (bWinInetDebug)
Log( "arrReceive: " + arrReceive[ 0 ]);
if (bWinInetDebug)
Log( "lReturn: " + lReturn[ 0 ]);
// InternetReadFile() has succeeded, but we may be at the end of the data if (lReturn[ 0 ] == 0 )
{
if (bWinInetDebug)
Print ( "Reached end of data" );
bKeepReading = false ;
bSuccess = true ;
}
else
{
// Convert the data from Ansi to Unicode using the built-in MT4 functionstring strThisRead = CharArrayToString (arrReceive, 0 , lReturn[ 0 ], CP_UTF8 );
strWebPage = StringConcatenate (strWebPage, strThisRead); // <-- PROBLEM HERE ON FIRST USE ONLY IN EACH MT4 SESSIONPrint ("------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>> strWebPage : ", strWebPage); // this shows garbage!
}
}
}
}
}
Print ( "Closing URL web connection" );
success = InternetCloseHandle(hInternetUrl);
if (success == 0 )
{
Message = Symbol () + " " + IndicatorName + " Error 896 - Unable to close URL handle!" ;
Print (Message);
Alert (Message);
HealthBuffer[ 0 ] = Error_state;
bSuccess = false ;
}
else
{
success = InternetCloseHandle(hInternet);
if (success == 0 )
{
Message = Symbol () + " " + IndicatorName + " Error 898 - Unable to close Internet Handle!" ;
Print (Message);
Alert (Message);
HealthBuffer[ 0 ] = Error_state;
bSuccess = false ;
}
}
return (bSuccess);
} // end of function
...그러나 해당 스크립트는 라이선스 쿼리 결과와 같은 짧은 서버 응답을 검색하는 데 계속 작동해야 합니다. 서버 응답의 크기가 1KB-ish를 초과하는 경우에만 문제가 있습니다.
감사합니다, 이것은 완벽하게 작동했습니다!
안녕하세요 thili55님,
GrabWeb()이 빌드 600에서 작동하도록 하기 위한 솔루션을 게시하고 저희를 도와주시겠습니까? 많은 사람들이 FFCal을 빌드 600과 함께 사용하는 데 관심이 있을 것이라고 생각합니다.
많은 감사
GrabWeb()이 빌드 600에서 작동하도록 하기 위한 솔루션을 게시하고 저희를 도와주시겠습니까? 많은 사람들이 FFCal을 빌드 600과 함께 사용하는 데 관심이 있을 것이라고 생각합니다.
thili55가 답장하는 게시물을 참조하세요. 하지만 현재 v600에는 FF 캘린더만큼 많은 데이터를 다운로드하는 데 영향을 줄 수 있는 문자열 처리 문제가 있는 것으로 보입니다.
답장을 보내 주셔서 감사합니다. 따라서 GrabWeb에 대한 솔루션을 고안하기 전에 v600의 수정 사항을 기다려야 합니까? 아니면 v603에서 수정 사항이 제공되었습니까?
답장을 보내 주셔서 감사합니다. 따라서 GrabWeb에 대한 솔루션을 고안하기 전에 v600의 수정 사항을 기다려야 합니까? 아니면 v603에서 수정 사항이 제공되었습니까?
다음은 v600에서 실행되도록 업데이트된 GrabWeb 기능입니다. 이제 InternetOpenW 및 InternetOpenUrlW 및 유니코드 변환을 사용합니다. XML 파일을 정상적으로 가져오지만 파일에는 모두 NULL 데이터가 있습니다. 코드에서 StrWebPage에 대한 Print 문을 참조하십시오. 출력된 데이터를 보면 strThisRead에 유효한 데이터가 있는 동안 쓰레기입니다. 누군가가 보고 수정 사항을 찾을 수 있는지 확인할 수 있습니까? 이 스레드의 수정 사항을 따릅니다. https://www.mql5.com/en/forum/149360
FFCal.mq4에 코드를 복사하여 붙여넣고 v600 MT4로 컴파일하고 실행하십시오(귀하의 버전에 속하지 않는 항목을 편집하여 컴파일하십시오).
GRABWEB 스크립트를 만들려고 합니다.
매우 간단합니다. 빌드 604에서 잘 작동합니다.
GRABWEB 스크립트를 만들려고 합니다.
매우 간단합니다. 빌드 604에서 잘 작동합니다.
이 코드 줄에 대해 v604에서 이 컴파일 오류를 어떻게 극복하고 있는지 여쭤봐도 될까요?
InternetReadFile(HttpRequest, Buffer, StringLen (Buffer), read);오류: '버퍼' - 매개변수 변환이 허용되지 않습니다.
MT4 버전을 확인하고 다시 시도하십시오!
이 코드 줄에 대해 v604에서 이 컴파일 오류를 어떻게 극복하고 있는지 여쭤봐도 될까요?
오류: '버퍼' - 매개변수 변환이 허용되지 않습니다.
MT4 버전을 확인하고 다시 시도하십시오!
이 프로그램이 있는 v604 및 v600에는 오류가 없고 경고가 없습니다. 파일이 올바르게 다운로드되었습니다.
GRABWEB 스크립트를 만들려고 합니다.
매우 간단합니다. 빌드 604에서 잘 작동합니다.
이 코드 줄에 대해 v604에서 이 컴파일 오류를 어떻게 극복하고 있는지 여쭤봐도 될까요?
오류: '버퍼' - 매개변수 변환이 허용되지 않습니다.
MT4 버전을 확인하고 다시 시도하십시오!
당신은 u char를 사용하고 있습니까?
내 스크립트에서 나는 문자열을 사용합니다.