Ir al contenido


Foto

HttpQueryInfo


  • Por favor identifícate para responder
No hay respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 mayo 2009 - 08:35



delphi
  1. BOOL HttpQueryInfo(
  2.   __in     HINTERNET hRequest,
  3.   __in     DWORD dwInfoLevel,
  4.   __inout  LPVOID lpvBuffer,
  5.   __inout  LPDWORD lpdwBufferLength,
  6.   __inout  LPDWORD lpdwIndex
  7. );



¿Os acordáis del mensaje de cHackAll Cómo resumir una descarga? Pues trasteando con ese código y añadiendo algunas cosas cosas me he encontrado con un problemilla en HttpQueryInfo. Cuando la uso para determinar lo que falta de descargar de un fichero, y el fichero terminó la descarga, deberí­a devolver en el contenido de lpvBuffer cero. Pues eso es lo que hace, pero no en todas las máquinas.

En determinados PC el comportamiento de la API cuando no se tiene nada que descargar falla y el mismo código en otro PC funciona bien.

Pongo un fragmento del código:


cpp
  1.    HINTERNET hInet, hConnect, hRequest;
  2.    HANDLE hFile;
  3.    DWORD Remainder = 0, Fail = 0, uBytes = 0, Size = 0, dwReserved = 0;
  4.    DWORD End = 0;
  5.    DWORD Ini = 0;
  6.    BOOL  Stop = false;
  7.    BOOL  Pause = false;
  8.  
  9.    BYTE Buffer[1024*64] = {0}; // 64 Kb.
  10.  
  11.    Remainder--;
  12.    Size = sizeof(Remainder);
  13.  
  14. //........
  15.  
  16.      Ini = SetFilePointer(hFile, 0, NULL, FILE_END);
  17.      lstrcat(itoa(SetFilePointer(hFile, 0, NULL, FILE_END), lstrcpy(Buffer, "range: bytes=")+13, 10), "-");
  18.      bool B = HttpAddRequestHeaders(hRequest, Buffer, lstrlen(Buffer), HTTP_ADDREQ_FLAG_ADD_IF_NEW);
  19.      if(HttpSendRequest(hRequest, NULL, 0, NULL, 0)){
  20.         HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &Remainder, &Size, &dwReserved);
  21.         if(!End) End = Remainder+Ini;
  22.         while (Remainder > 0 && InternetQueryDataAvailable(hRequest, &Size, 0, 0) && Size > 0){
  23.            InternetReadFile(hRequest, Buffer, Size, &uBytes);
  24.            Remainder -= _lwrite((HFILE)hFile, Buffer, uBytes);
  25.            Fail = 0;
  26.            // Manejo del progreso de la descarga
  27.            if(Progress){
  28.              Progress(End-Remainder, 0, End, &Stop, &Pause);
  29.              if(Stop){
  30.                 Fail = 2;
  31.                 break;
  32.              }
  33.            }
  34.         }
  35.      }
  36.  
  37. //.........



El problema de detectar que el archivo se terminó de descargar se puede solucionar de varias formas, pero lo que me intriga es el comportamiento anómalo de la API y me fastidia añadir mas código cuando tal como está funciona en algunos PCs.  *-)

He de añadir que el fallo se produce es unos PCs que se conectan a internet con un proxy (para lo que adapté el código con autentificación). No se si este detalle tiene algo que ver o es circunstancial.

Si conocéis alguna respuesta soy todo ojos.

Gracias y Saludos.


  • 0




IP.Board spam blocked by CleanTalk.