네 그게 문제였습니다. 이제 v604에서 잘 컴파일됩니다. 따라서 기본적으로 InternetOpenW와InternetOpenUrlW를 사용하고 이전과 같은 방식으로 문자열을 연결해야 합니다.
저는 빌드 600이 나온 이후로 WDHolic에서 개발한 위의 코드를 성공적으로 사용하고 있습니다(정말 감사합니다 :-)). 불행히도 오늘 빌드 830에서 코드를 재컴파일했을 때 더 이상 작동하지 않는다는 것을 발견했습니다. 어떤 친절한 사람이 다시 작동하도록 조정을 제안할 수 있는지 궁금합니다. 내가 사용하는 코드는 다음과 같습니다.
string secData= "" ;
if (!GrabWeb(secURL, secData))
{
showDebug( "Unable to access user file" );
return ( 1 );
}
.
.
.
.
#import "Wininet.dll"int InternetOpenW( string , int , string , string , int );
int InternetConnectW( int , string , int , string , string , int , int , int );
int HttpOpenRequestW( int , string , string , int , string , int , string , int );
int InternetOpenUrlW( int , string , string , int , int , int );
int InternetReadFile( int , string , int , int & OneInt[]);
int InternetCloseHandle( int );
#import
bool GrabWeb( string strUrl, string & strWebPage)
{
int HttpOpen = InternetOpenW( " " , 0 , " " , " " , 0 );
int HttpConnect = InternetConnectW(HttpOpen, "" , 80 , "" , "" , 3 , 0 , 1 );
int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL , 0 , 0 , 0 );
int read[ 1 ];
string Buffer = " " ;
while ( true )
{
InternetReadFile(HttpRequest, Buffer, StringLen (Buffer), read);
if (read[ 0 ] > 0 ) strWebPage = strWebPage + StringSubstr (Buffer, 0 , read[ 0 ]);
elsebreak ;
}
if (HttpRequest > 0 ) InternetCloseHandle(HttpRequest);
if (HttpConnect > 0 ) InternetCloseHandle(HttpConnect);
if (HttpOpen > 0 ) InternetCloseHandle(HttpOpen);
return ( true );
}
Grabweb은 몇 년 전에 처음 접한 방법이며 다른 옵션을 조사하는 것보다 계속 사용하는 것이 더 쉽습니다! WebRequest를 살펴보고 내 코드에 빌드할 수 있는지 확인하겠습니다. 제안해 주셔서 감사합니다. 제 경험을 바탕으로 다시 게시하겠습니다. 성공하기를 바랍니다 :-)
WebRequest() 함수는 비동기식이므로 프로그램 실행을 중단하고 요청된 서버의 응답을 기다립니다. 응답 수신 지연이 클 수 있으므로 표시기의 호출에 함수를 사용할 수 없습니다. 표시기는 하나의 기호에 있는 모든 표시기 및 차트가 공유하는 공통 스레드에서 실행되기 때문입니다. 심볼 차트 중 하나의 지표 성능 지연으로 인해 동일한 심볼의 모든 차트 업데이트가 중지될 수 있습니다.
내 뉴스 알림에서 WebRequest를 사용하지만 WebRequest에는 모든 사람에게 적합하지 않은 한 가지 단점이 있습니다. 바로 EA에서만 사용할 수 있다는 것입니다.
WebRequest() 함수는 비동기식 이므로 프로그램 실행을 중단하고 요청된 서버의 응답을 기다립니다. 응답 수신 지연이 클 수 있으므로 표시기의 호출에 함수를 사용할 수 없습니다. 표시기는 하나의 기호에 있는 모든 표시기 및 차트가 공유하는 공통 스레드에서 실행되기 때문입니다. 심볼 차트 중 하나의 지표 성능 지연으로 인해 동일한 심볼의 모든 차트 업데이트가 중지될 수 있습니다.
내 현재 요구 사항은 EA에 있으므로 WebRequest가 아마도 단기적인 답변이 될 것입니다.
그러나 뉴스에 액세스할 수 있는 여러 지표가 있습니다. 즉, 계속 유지 관리할 수 있도록 하려면 Grabweb에서 무엇을 변경할지 시도하고 해결해야 합니다. 이 기사의 정보가 답을 제공할 수 있을지 궁금합니다. https://www.mql5.com/en/articles/73 ?
내 현재 요구 사항은 EA에 있으므로 WebRequest가 아마도 단기적인 답변이 될 것입니다.
그러나 뉴스에 액세스할 수 있는 여러 지표가 있습니다. 즉, 계속 유지 관리할 수 있도록 하려면 Grabweb에서 무엇을 변경할지 시도하고 해결해야 합니다. 이 기사의 정보가 답을 제공할 수 있을지 궁금합니다. https://www.mql5.com/en/articles/73 ?
답을 찾은 것 같습니다. 그리고 그것은 위에서 언급한 기사에 있었습니다. GrabWeb 코드는 이제 다음과 같습니다.
#import "Wininet.dll"int InternetOpenW( string , int , string , string , int );
int InternetConnectW( int , string , int , string , string , int , int , int );
int HttpOpenRequestW( int , string , string , int , string , int , string , int );
int InternetOpenUrlW( int , string , string , int , int , int );
//int InternetReadFile(int, string, int, int& OneInt[]);int InternetReadFile( int , uchar &sBuffer[], int , int & OneInt);int InternetCloseHandle( int );
#import
bool GrabWeb( string strUrl, string & strWebPage)
{
int HttpOpen = InternetOpenW( " " , 0 , " " , " " , 0 );
int HttpConnect = InternetConnectW(HttpOpen, "" , 80 , "" , "" , 3 , 0 , 1 );
int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL , 0 , 0 , 0 );
/*int read[1];
string Buffer = " ";
while (true)
{
InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
if (read[0] > 0) strWebPage = strWebPage + StringSubstr(Buffer, 0, read[0]);
else break;
}*/uchar ch[ 500 ];
string toStr= "" ;
int dwBytes,h;
while (InternetReadFile(HttpRequest,ch, 500 ,dwBytes))
{
if (dwBytes<= 0 ) break ;
toStr=toStr+ CharArrayToString (ch, 0 ,dwBytes);
}
strWebPage=toStr; if (HttpRequest > 0 ) InternetCloseHandle(HttpRequest);
if (HttpConnect > 0 ) InternetCloseHandle(HttpConnect);
if (HttpOpen > 0 ) InternetCloseHandle(HttpOpen);
return ( true );
}
원래...
1) 데이터에 대해 uchar 배열에 대한 간접 참조를 사용하고 개수에 대해 직접적인 단순 int 변수를 사용하도록 InternetRead의 정의를 변경했습니다.
2) InternetRead 함수가 uchar 배열을 사용하도록 만든 다음 채워진 배열을 문자열로 변환했습니다.
uchar 배열의 크기가 어떤 영향을 미치는지 잘 모르겠습니다. 관계없이 전체 웹 페이지(예: FFCal XML)를 읽는 것으로 보이며 500바이트보다 큽니다. 다음 n 바이트의 메모리에 대해 뻔뻔스러운 소리를 내는 것입니까, 아니면 시스템이 스토리지를 동적으로 할당할 만큼 충분히 영리합니까? 바라건대, 후자!
당신은 u char를 사용하고 있습니까?
내 스크립트에서 나는 문자열을 사용합니다.
네 그게 문제였습니다. 이제 v604에서 잘 컴파일됩니다. 따라서 기본적으로 InternetOpenW와 InternetOpenUrlW를 사용하고 이전과 같은 방식으로 문자열을 연결해야 합니다.
네 그게 문제였습니다. 이제 v604에서 잘 컴파일됩니다. 따라서 기본적으로 InternetOpenW와 InternetOpenUrlW를 사용하고 이전과 같은 방식으로 문자열을 연결해야 합니다.
저는 빌드 600이 나온 이후로 WDHolic에서 개발한 위의 코드를 성공적으로 사용하고 있습니다(정말 감사합니다 :-)). 불행히도 오늘 빌드 830에서 코드를 재컴파일했을 때 더 이상 작동하지 않는다는 것을 발견했습니다. 어떤 친절한 사람이 다시 작동하도록 조정을 제안할 수 있는지 궁금합니다. 내가 사용하는 코드는 다음과 같습니다.
이제 공백만 반환하는 것으로 보입니다.
어떤 도움이라도 가장 감사하게 받을 것입니다. 기대해 주셔서 감사합니다.
그렉
WebRequest 를 대신 사용하지 않을 이유가 있습니까?
Grabweb은 몇 년 전에 처음 접한 방법이며 다른 옵션을 조사하는 것보다 계속 사용하는 것이 더 쉽습니다! WebRequest를 살펴보고 내 코드에 빌드할 수 있는지 확인하겠습니다. 제안해 주셔서 감사합니다. 제 경험을 바탕으로 다시 게시하겠습니다. 성공하기를 바랍니다 :-)
감사해요,
그렉
WebRequest 를 대신 사용하지 않을 이유가 있습니까?
내 뉴스 알림에서 WebRequest를 사용하지만 WebRequest에는 모든 사람에게 적합하지 않은 한 가지 단점이 있습니다. 바로 EA에서만 사용할 수 있다는 것입니다.
WebRequest 문서에서:
WebRequest() 함수는 비동기식이므로 프로그램 실행을 중단하고 요청된 서버의 응답을 기다립니다. 응답 수신 지연이 클 수 있으므로 표시기의 호출에 함수를 사용할 수 없습니다. 표시기는 하나의 기호에 있는 모든 표시기 및 차트가 공유하는 공통 스레드에서 실행되기 때문입니다. 심볼 차트 중 하나의 지표 성능 지연으로 인해 동일한 심볼의 모든 차트 업데이트가 중지될 수 있습니다.
내 뉴스 알림에서 WebRequest를 사용하지만 WebRequest에는 모든 사람에게 적합하지 않은 한 가지 단점이 있습니다. 바로 EA에서만 사용할 수 있다는 것입니다.
WebRequest() 함수는 비동기식 이므로 프로그램 실행을 중단하고 요청된 서버의 응답을 기다립니다. 응답 수신 지연이 클 수 있으므로 표시기의 호출에 함수를 사용할 수 없습니다. 표시기는 하나의 기호에 있는 모든 표시기 및 차트가 공유하는 공통 스레드에서 실행되기 때문입니다. 심볼 차트 중 하나의 지표 성능 지연으로 인해 동일한 심볼의 모든 차트 업데이트가 중지될 수 있습니다.
동기식이어야 합니다.
내 현재 요구 사항은 EA에 있으므로 WebRequest가 아마도 단기적인 답변이 될 것입니다.
그러나 뉴스에 액세스할 수 있는 여러 지표가 있습니다. 즉, 계속 유지 관리할 수 있도록 하려면 Grabweb에서 무엇을 변경할지 시도하고 해결해야 합니다. 이 기사의 정보가 답을 제공할 수 있을지 궁금합니다. https://www.mql5.com/en/articles/73 ?
내 현재 요구 사항은 EA에 있으므로 WebRequest가 아마도 단기적인 답변이 될 것입니다.
그러나 뉴스에 액세스할 수 있는 여러 지표가 있습니다. 즉, 계속 유지 관리할 수 있도록 하려면 Grabweb에서 무엇을 변경할지 시도하고 해결해야 합니다. 이 기사의 정보가 답을 제공할 수 있을지 궁금합니다. https://www.mql5.com/en/articles/73 ?
답을 찾은 것 같습니다. 그리고 그것은 위에서 언급한 기사에 있었습니다. GrabWeb 코드는 이제 다음과 같습니다.
원래...
1) 데이터에 대해 uchar 배열에 대한 간접 참조를 사용하고 개수에 대해 직접적인 단순 int 변수를 사용하도록 InternetRead의 정의를 변경했습니다.
2) InternetRead 함수가 uchar 배열을 사용하도록 만든 다음 채워진 배열을 문자열로 변환했습니다.
uchar 배열의 크기가 어떤 영향을 미치는지 잘 모르겠습니다. 관계없이 전체 웹 페이지(예: FFCal XML)를 읽는 것으로 보이며 500바이트보다 큽니다. 다음 n 바이트의 메모리에 대해 뻔뻔스러운 소리를 내는 것입니까, 아니면 시스템이 스토리지를 동적으로 할당할 만큼 충분히 영리합니까? 바라건대, 후자!
건배,
그렉
이 코드는 더 이상 내 서버의 계정을 확인하지 않는 MT4 빌드 600에서 테스트할 때까지 완벽하게 작동했습니다.
안녕하세요 여러분, 이 코드는 무엇에 관한 것입니까? 표시기입니까 아니면 EA입니까? mql4 편집기에서 실행하려고 시도했는데 다음 오류 메시지가 나타납니다.
'사용자 - 선언되지 않은 식별자'
실제로 다음 코드 줄을 참조하고 있습니다.
(라인: 112) GrabWeb("http://www.website.com/query.php?accountnumber="+AccountNumber()+"&login="+사용자, 답변);
프로그램에서 "사용자"를 수락하도록 선언하려면 어떻게 해야 합니까? 또는 "사용자"를 무엇으로 바꿀 수 있습니까?
저는 Windows 8.1, 64비트 OS 및 MT4 버전 4.00, 빌드 1010을 사용하고 있습니다.
미리 감사드립니다.