delphi
BOOL HttpQueryInfo( __in HINTERNET hRequest, __in DWORD dwInfoLevel, __inout LPVOID lpvBuffer, __inout LPDWORD lpdwBufferLength, __inout LPDWORD lpdwIndex );
¿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
HINTERNET hInet, hConnect, hRequest; HANDLE hFile; DWORD Remainder = 0, Fail = 0, uBytes = 0, Size = 0, dwReserved = 0; DWORD End = 0; DWORD Ini = 0; BOOL Stop = false; BOOL Pause = false; BYTE Buffer[1024*64] = {0}; // 64 Kb. Remainder--; Size = sizeof(Remainder); //........ Ini = SetFilePointer(hFile, 0, NULL, FILE_END); lstrcat(itoa(SetFilePointer(hFile, 0, NULL, FILE_END), lstrcpy(Buffer, "range: bytes=")+13, 10), "-"); bool B = HttpAddRequestHeaders(hRequest, Buffer, lstrlen(Buffer), HTTP_ADDREQ_FLAG_ADD_IF_NEW); if(HttpSendRequest(hRequest, NULL, 0, NULL, 0)){ HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &Remainder, &Size, &dwReserved); if(!End) End = Remainder+Ini; while (Remainder > 0 && InternetQueryDataAvailable(hRequest, &Size, 0, 0) && Size > 0){ InternetReadFile(hRequest, Buffer, Size, &uBytes); Remainder -= _lwrite((HFILE)hFile, Buffer, uBytes); Fail = 0; // Manejo del progreso de la descarga if(Progress){ Progress(End-Remainder, 0, End, &Stop, &Pause); if(Stop){ Fail = 2; break; } } } } //.........
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.