Funzione WinHttpQueryDataAvailable (winhttp.h)
La funzione WinHttpQueryDataAvailable restituisce la quantità di dati, in byte, disponibile per la lettura con WinHttpReadData.
Sintassi
WINHTTPAPI BOOL WinHttpQueryDataAvailable(
[in] HINTERNET hRequest,
[out] LPDWORD lpdwNumberOfBytesAvailable
);
Parametri
[in] hRequest
Handle DELL'oggetto VALIDNET restituito da WinHttpOpenRequest. WinHttpReceiveResponse deve essere stato chiamato per questo handle e aver completato prima di chiamare WinHttpQueryDataAvailable .
[out] lpdwNumberOfBytesAvailable
Puntatore a una variabile long integer senza segno che riceve il numero di byte disponibili. Quando WinHTTP viene usato in modalità asincrona, impostare sempre questo parametro su NULL e recuperare i dati nella funzione di callback; non farlo può causare un errore di memoria.
Valore restituito
Restituisce TRUE se la funzione ha esito positivo o FALSE in caso contrario. Per ottenere dati di errore estesi, chiamare GetLastError. Tra i codici di errore restituiti sono riportati di seguito.
Codice di errore | Descrizione |
---|---|
|
La connessione con il server è stata reimpostata o terminata oppure è stato rilevato un protocollo SSL incompatibile. Ad esempio, WinHTTP versione 5.1 non supporta SSL2 a meno che il client non lo consenta in modo specifico. |
|
Impossibile completare l'operazione richiesta perché l'handle fornito non è nello stato corretto. |
|
Il tipo di handle fornito non è corretto per questa operazione. |
|
Si è verificato un errore interno. |
|
L'operazione è stata annullata, in genere perché l'handle su cui era operativa la richiesta è stato chiuso prima del completamento dell'operazione. |
|
Timeout della richiesta. |
|
Memoria insufficiente per completare l'operazione richiesta. (Codice errore di Windows) |
Commenti
Anche quando WinHTTP viene usato in modalità asincrona , ovvero quando WINHTTP_FLAG_ASYNC è stato impostato in WinHttpOpen, questa funzione può operare in modo sincrono o asincrono. Se restituisce FALSE, l'errore non è riuscito ed è possibile chiamare GetLastError per ottenere informazioni estese sull'errore. Se restituisce TRUE, usare il WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE completamento per determinare se questa funzione ha avuto esito positivo e il valore dei parametri. Il completamento WINHTTP_CALLBACK_STATUS_REQUEST_ERROR indica che l'operazione è stata completata in modo asincrono, ma non riuscita.
La quantità di dati rimanenti non viene ricalcolata finché non vengono letti tutti i dati disponibili indicati dalla chiamata a WinHttpQueryDataAvailable .
Usare il valore restituito di WinHttpReadData per determinare quando una risposta è stata completamente letta.
Se è stata installata una funzione di callback di stato con WinHttpSetStatusCallback, le notifiche seguenti impostate nel parametro dwNotificationFlags di WinHttpSetStatusCallback indicano lo stato di avanzamento nel controllo dei dati disponibili:
- WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
- WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
- WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
Esempio
L'esempio seguente illustra come usare la semantica della transazione sicura per scaricare una risorsa da un server HTTPS. Il codice di esempio inizializza l'API WinHTTP, seleziona un server HTTPS di destinazione e quindi apre e invia una richiesta per questa risorsa protetta.
WinHttpQueryDataAvailable viene usato con l'handle di richiesta per determinare la quantità di dati disponibili per il download, quindi WinHttpReadData viene usato per leggere i dati. Questo processo si ripete fino a quando non viene recuperato e visualizzato l'intero documento.
Importante
Se vuoi che alcuni dati vengano elaborati e analizzati al momento della ricezione, devi chiamare WinHttpQueryDataAvailable e WinHttpReadData. Se si sta tentando di scaricare l'intera risposta il più rapidamente possibile, chiamare direttamente WinHttpReadData , perché WinHttpReadData tenta di riempire il buffer prima del completamento.
L'esempio di codice seguente alloca anche in ogni iterazione del ciclo. Per il codice di produzione, dove le prestazioni sono importanti, è invece possibile iniziare con un buffer di dimensioni appropriate (ad esempio 1 megabyte) e ridimensionarlo, se necessario. In pratica , WinHttpQueryDataAvailable restituisce non più di 8 kilobyte.
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
// Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect( hSession, L"www.microsoft.com",
INTERNET_DEFAULT_HTTPS_PORT, 0);
// Create an HTTP request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE);
// Send a request.
if (hRequest)
bResults = WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0, WINHTTP_NO_REQUEST_DATA, 0,
0, 0);
// End the request.
if (bResults)
bResults = WinHttpReceiveResponse( hRequest, NULL);
// Continue to verify data until there is nothing left.
if (bResults)
do
{
// Verify available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
printf( "Error %u in WinHttpQueryDataAvailable.\n",
GetLastError());
// Allocate space for the buffer.
pszOutBuffer = new char[dwSize+1];
if (!pszOutBuffer)
{
printf("Out of memory\n");
dwSize=0;
}
else
{
// Read the Data.
ZeroMemory(pszOutBuffer, dwSize+1);
if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded))
printf( "Error %u in WinHttpReadData.\n", GetLastError());
else
printf( "%s\n", pszOutBuffer);
// Free the memory allocated to the buffer.
delete [] pszOutBuffer;
}
} while (dwSize > 0);
// Report any errors.
if (!bResults)
printf( "Error %d has occurred.\n", GetLastError());
// Close open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
Requisiti
Client minimo supportato | Windows XP, Windows 2000 Professional con SP3 [solo app desktop] |
Server minimo supportato | Windows Server 2003, Windows 2000 Server con SP3 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | winhttp.h |
Libreria | Winhttp.lib |
DLL | Winhttp.dll |
Componente ridistribuibile | WinHTTP 5.0 e Internet Explorer 5.01 o versione successiva in Windows XP e Windows 2000. |
Vedi anche
Informazioni sui servizi HTTP di Microsoft Windows (WinHTTP)