Собственно, надо загрузить с сайта страничку, чтобы считать с неё информацию. Для этого решил воспользоваться системным wininet.dll. Для этого: Код (Text): invoke InternetOpen,mHello,1,0,0,0; 1 = INTERNET_OPEN_TYPE_DIRECT - прямое соединение (без прокси) результат ок, далее: Код (Text): invoke InternetOpenUrl,eax,url,0,0,0,handle результат ок, пробуем считать данные: Код (Text): invoke InternetReadFile,[handle],buffer,65536,tmp результат - ошибка. Вызываем GetLastError, получаем ERR_NO_CONNECTION. В чём могут быть грабли? Может в InternetOpenUrl надо что-то указывать в поле lpszHeaders типа "Accept: */*"? Растолкуйте плиз чайнику где грабли?
говорит о том что вы не законнектились) InternetConnect() еще нужно вызывавть. кусок кода с тестового прожа. Код (Text): #define INTERNET_POST_HEADER "Content-Type: application/x-www-form-urlencoded" typedef struct _INTERNET_HANDLES { HINTERNET hOpen; HINTERNET hConnect; HINTERNET hRequest; } INTERNET_HANDLES, *PINTERNET_HANDLES; BOOL InternetRequestCreate( IN PCHAR Url, IN OUT PINTERNET_HANDLES iHandle, IN PCHAR Verb ) { URL_COMPONENTSA UrlComp = {0}; CHAR HostName[MAX_PATH], UrlPath[MAX_PATH]; DWORD Flag = SECURITY_FLAG_IGNORE_REVOCATION, Flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE; iHandle->hOpen = InternetOpenA( "", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); if (iHandle->hOpen != NULL) { UrlComp.dwStructSize = sizeof(URL_COMPONENTS); UrlComp.lpszHostName = HostName; UrlComp.dwHostNameLength = ARRAYSIZE( HostName ); UrlComp.lpszUrlPath = UrlPath; UrlComp.dwUrlPathLength = ARRAYSIZE( UrlPath ); if (!InternetCrackUrlA( Url, 0, 0, &UrlComp )) { InternetCloseHandle( iHandle->hOpen ); return FALSE; } iHandle->hConnect = InternetConnectA( iHandle->hOpen, HostName, UrlComp.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0 ); if (iHandle->hConnect != NULL) { if (UrlComp.nScheme == INTERNET_SCHEME_HTTPS) { Flags |= INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID; } iHandle->hRequest = HttpOpenRequestA( iHandle->hConnect, Verb, UrlPath, 0, 0, 0, Flags, 0 ); if (iHandle->hRequest != NULL) { if (UrlComp.nScheme == INTERNET_SCHEME_HTTPS) { if (!InternetSetOption( iHandle->hRequest, INTERNET_OPTION_SECURITY_FLAGS, &Flag, sizeof(Flag) )) { InternetCloseHandles( iHandle ); return FALSE; } } return TRUE; } } InternetCloseHandles( iHandle ); } return FALSE; } VOID InternetCloseHandles( IN PINTERNET_HANDLES iHandle ) { InternetCloseHandle( iHandle->hRequest ); InternetCloseHandle( iHandle->hConnect ); InternetCloseHandle( iHandle->hOpen ); } BOOL InternetPost( IN PCHAR Url, IN PBYTE Buffer, IN DWORD BuffSize ) { INTERNET_HANDLES iHandle; DWORD result = FALSE, BuffLen = 1024*50; CHAR OutBuff[1024*50]; if (InternetRequestCreate( Url, &iHandle, "POST" )) { result = HttpSendRequestA( iHandle.hRequest, INTERNET_POST_HEADER, strlen( INTERNET_POST_HEADER ), Buffer, BuffSize ); InternetReadFile( iHandle.hRequest, OutBuff, BuffLen, &BuffLen ); //HttpQueryInfoA( iHandle.hRequest, // HTTP_QUERY_CONTENT_LOCATION, // OutBuff, // &BuffLen, // 0 ); InternetCloseHandles( &iHandle ); } return result; }
Sabrewulf Код (Text): .data lpszUrl db "http://site.com",0 lpszAgent db "UserAgent",0 .data? InternetHandle dd ? FileHandle dd ? FileBuffer db 1024 dup (?) BytesRead dd ? Invoke InternetOpen,addr lpszAgent,0,0,0,0 mov InternetHandle,eax Invoke InternetOpenUrl,InternetHandle,addr lpszUrl,0,0,0,0 mov FileHandle,eax Invoke InternetReadFile,FileHandle,addr FileBuffer,128,addr BytesRead Invoke InternetCloseHandle,InternetHandle Invoke MessageBox,0,addr FileBuffer,addr lpszUrl,MB_OK Выводит первые 1024 байты страницы в мессаджбоксе.
ASMatic Вовсе не обязательно. У InternetOpenUrl первый параметр - хендл созданный именно InternetOpen. InternetConnect нужен если мы вручную работаем используя функции типа HttpOpenRequest и HttpSendRequest. M0rg0t Спасибо, виной всему моя невнимательность (писал код уже на грани сна). Сравнил наши сорцы и обнаружил ошибку При изучении InternetOpenUrl на msdn мне померещилось, что последний параметр функции - указатель на точку где будет сохранён хендл Как результат, InternetReadFile вызывалась с хендлом=0 Мне только и осталось добавить в код mov [handle],eax и всё заработало как надо
Но обнаружилась другая проблема: InternetReadFile читает только первые 1087 или 2517 байт (рандомно). Почему так, пока не ясно.
Почему не читает заданное кол-во байт так и не понял, но проблему решил чтением в цикле кусочками по 1024 байта (чтоб наверняка): Код (Text): xor ebx,ebx ; счётчик mov edi,buffer ; адрес буфера readdata: invoke InternetReadFile,[hinet],edi,1024,tmp test eax,eax jz downcomplete mov eax,[tmp] add edi,eax add ebx,eax cmp ebx,64000 ; не переполнится ли буфер если данных вдруг будет очень много? ja downcomplete ; если да - прерываем загрузку test eax,eax ; все ли загружено? jnz readdata downcomplete: ; на выходе в ebx реальное кол-во прочитанных байт Так читает до конца