wininet.dll - загрузить страничку

Тема в разделе "WASM.WIN32", создана пользователем Sabrewulf, 5 дек 2011.

  1. Sabrewulf

    Sabrewulf New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    11
    Собственно, надо загрузить с сайта страничку, чтобы считать с неё информацию. Для этого решил воспользоваться системным wininet.dll.

    Для этого:
    Код (Text):
    1. invoke  InternetOpen,mHello,1,0,0,0; 1 = INTERNET_OPEN_TYPE_DIRECT - прямое соединение (без прокси)
    результат ок, далее:
    Код (Text):
    1. invoke  InternetOpenUrl,eax,url,0,0,0,handle
    результат ок, пробуем считать данные:
    Код (Text):
    1. invoke  InternetReadFile,[handle],buffer,65536,tmp
    результат - ошибка. Вызываем GetLastError, получаем ERR_NO_CONNECTION. В чём могут быть грабли? Может в InternetOpenUrl надо что-то указывать в поле lpszHeaders типа "Accept: */*"? Растолкуйте плиз чайнику где грабли?
     
  2. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    говорит о том что вы не законнектились)
    InternetConnect() еще нужно вызывавть.

    кусок кода с тестового прожа.
    Код (Text):
    1. #define INTERNET_POST_HEADER    "Content-Type: application/x-www-form-urlencoded"
    2. typedef struct _INTERNET_HANDLES {
    3.  
    4.     HINTERNET       hOpen;
    5.     HINTERNET       hConnect;
    6.     HINTERNET       hRequest;
    7.  
    8. } INTERNET_HANDLES, *PINTERNET_HANDLES;
    9.  
    10. BOOL
    11. InternetRequestCreate(
    12.     IN      PCHAR               Url,
    13.     IN  OUT PINTERNET_HANDLES   iHandle,
    14.     IN      PCHAR               Verb
    15.     )
    16. {
    17.     URL_COMPONENTSA     UrlComp = {0};
    18.     CHAR                HostName[MAX_PATH],
    19.                         UrlPath[MAX_PATH];
    20.     DWORD               Flag = SECURITY_FLAG_IGNORE_REVOCATION,
    21.                         Flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE;
    22.                        
    23.  
    24.     iHandle->hOpen = InternetOpenA( "",
    25.                                     INTERNET_OPEN_TYPE_PRECONFIG,
    26.                                     NULL,
    27.                                     NULL,
    28.                                     0 );
    29.  
    30.     if (iHandle->hOpen != NULL) {
    31.  
    32.         UrlComp.dwStructSize = sizeof(URL_COMPONENTS);
    33.         UrlComp.lpszHostName = HostName;
    34.         UrlComp.dwHostNameLength = ARRAYSIZE( HostName );
    35.         UrlComp.lpszUrlPath = UrlPath;
    36.         UrlComp.dwUrlPathLength = ARRAYSIZE( UrlPath );
    37.  
    38.         if (!InternetCrackUrlA( Url, 0, 0, &UrlComp )) {
    39.             InternetCloseHandle( iHandle->hOpen );
    40.             return FALSE;
    41.         }
    42.  
    43.         iHandle->hConnect = InternetConnectA( iHandle->hOpen,
    44.                                               HostName,
    45.                                               UrlComp.nPort,
    46.                                               NULL,
    47.                                               NULL,
    48.                                               INTERNET_SERVICE_HTTP,
    49.                                               0, 0 );
    50.  
    51.         if (iHandle->hConnect != NULL) {
    52.  
    53.             if (UrlComp.nScheme == INTERNET_SCHEME_HTTPS) {
    54.                 Flags |= INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
    55.                          INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
    56.             }
    57.  
    58.             iHandle->hRequest = HttpOpenRequestA( iHandle->hConnect,
    59.                                                   Verb,
    60.                                                   UrlPath,
    61.                                                   0, 0, 0,
    62.                                                   Flags,
    63.                                                   0 );
    64.  
    65.             if (iHandle->hRequest != NULL) {
    66.  
    67.                 if (UrlComp.nScheme == INTERNET_SCHEME_HTTPS) {
    68.                     if (!InternetSetOption( iHandle->hRequest, INTERNET_OPTION_SECURITY_FLAGS, &Flag, sizeof(Flag) )) {
    69.                         InternetCloseHandles( iHandle );
    70.                         return FALSE;
    71.                     }
    72.                 }
    73.  
    74.                 return TRUE;
    75.             }
    76.         }
    77.  
    78.         InternetCloseHandles( iHandle );
    79.     }
    80.  
    81.     return FALSE;
    82. }
    83.  
    84. VOID
    85. InternetCloseHandles(
    86.     IN      PINTERNET_HANDLES   iHandle
    87.     )
    88. {
    89.     InternetCloseHandle( iHandle->hRequest );
    90.     InternetCloseHandle( iHandle->hConnect );
    91.     InternetCloseHandle( iHandle->hOpen );
    92. }
    93.  
    94. BOOL
    95. InternetPost(
    96.     IN      PCHAR   Url,
    97.     IN      PBYTE   Buffer,
    98.     IN      DWORD   BuffSize
    99.     )
    100. {
    101.     INTERNET_HANDLES    iHandle;
    102.     DWORD               result = FALSE,
    103.                         BuffLen = 1024*50;
    104.     CHAR    OutBuff[1024*50];
    105.  
    106.     if (InternetRequestCreate( Url, &iHandle, "POST" )) {
    107.  
    108.         result = HttpSendRequestA( iHandle.hRequest,
    109.                                    INTERNET_POST_HEADER,
    110.                                    strlen( INTERNET_POST_HEADER ),
    111.                                    Buffer,
    112.                                    BuffSize );
    113.  
    114.         InternetReadFile( iHandle.hRequest,
    115.                           OutBuff,
    116.                           BuffLen,
    117.                           &BuffLen );
    118.         //HttpQueryInfoA( iHandle.hRequest,
    119.         //                HTTP_QUERY_CONTENT_LOCATION,
    120.         //                OutBuff,
    121.         //                &BuffLen,
    122.         //                0 );
    123.  
    124.  
    125.         InternetCloseHandles( &iHandle );
    126.     }
    127.  
    128.     return result;
    129. }
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Sabrewulf

    Код (Text):
    1. .data
    2. lpszUrl db "http://site.com",0
    3. lpszAgent db "UserAgent",0
    4.  
    5.  
    6. .data?
    7. InternetHandle dd ?
    8. FileHandle dd ?
    9. FileBuffer db 1024 dup (?)
    10. BytesRead dd ?
    11.  
    12. Invoke InternetOpen,addr lpszAgent,0,0,0,0
    13. mov InternetHandle,eax
    14. Invoke InternetOpenUrl,InternetHandle,addr lpszUrl,0,0,0,0
    15. mov FileHandle,eax
    16. Invoke InternetReadFile,FileHandle,addr FileBuffer,128,addr BytesRead
    17. Invoke InternetCloseHandle,InternetHandle
    18.  
    19. Invoke MessageBox,0,addr FileBuffer,addr lpszUrl,MB_OK
    Выводит первые 1024 байты страницы в мессаджбоксе.
     
  4. Sabrewulf

    Sabrewulf New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    11
    ASMatic
    Вовсе не обязательно. У InternetOpenUrl первый параметр - хендл созданный именно InternetOpen. InternetConnect нужен если мы вручную работаем используя функции типа HttpOpenRequest и HttpSendRequest.

    M0rg0t
    Спасибо, виной всему моя невнимательность (писал код уже на грани сна). Сравнил наши сорцы и обнаружил ошибку :) При изучении InternetOpenUrl на msdn мне померещилось, что последний параметр функции - указатель на точку где будет сохранён хендл :lol: Как результат, InternetReadFile вызывалась с хендлом=0 :lol: Мне только и осталось добавить в код mov [handle],eax и всё заработало как надо :)
     
  5. Sabrewulf

    Sabrewulf New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    11
    Но обнаружилась другая проблема: InternetReadFile читает только первые 1087 или 2517 байт (рандомно). Почему так, пока не ясно.
     
  6. Sabrewulf

    Sabrewulf New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    11
    Почему не читает заданное кол-во байт так и не понял, но проблему решил чтением в цикле кусочками по 1024 байта (чтоб наверняка):

    Код (Text):
    1.                 xor     ebx,ebx             ; счётчик
    2.                 mov     edi,buffer          ; адрес буфера
    3. readdata:       invoke  InternetReadFile,[hinet],edi,1024,tmp
    4.                 test    eax,eax
    5.                 jz      downcomplete
    6.                 mov     eax,[tmp]
    7.                 add     edi,eax
    8.                 add     ebx,eax
    9.                 cmp     ebx,64000           ; не переполнится ли буфер если данных вдруг будет очень много?
    10.                 ja      downcomplete        ; если да - прерываем загрузку
    11.                 test    eax,eax             ; все ли загружено?
    12.                 jnz     readdata
    13. downcomplete:                               ; на выходе в ebx реальное кол-во прочитанных байт
    Так читает до конца :)
     
  7. xvalik

    xvalik xvalik

    Публикаций:
    0
    Регистрация:
    7 дек 2011
    Сообщения:
    1
    Адрес:
    Minsk
    Прикольно,попробую.