WinHttpQueryDataAvailable-Funktion (winhttp.h)
Die WinHttpQueryDataAvailable-Funktion gibt die Datenmenge in Bytes zurück, die mit WinHttpReadData gelesen werden kann.
Syntax
WINHTTPAPI BOOL WinHttpQueryDataAvailable(
[in] HINTERNET hRequest,
[out] LPDWORD lpdwNumberOfBytesAvailable
);
Parameter
[in] hRequest
Ein gültiges HINTERNET-Handle , das von WinHttpOpenRequest zurückgegeben wird. WinHttpReceiveResponse muss für dieses Handle aufgerufen und abgeschlossen sein, bevor WinHttpQueryDataAvailable aufgerufen wird.
[out] lpdwNumberOfBytesAvailable
Ein Zeiger auf eine variable Long-Integer ohne Vorzeichen, die die Anzahl der verfügbaren Bytes empfängt. Wenn WinHTTP im asynchronen Modus verwendet wird, legen Sie diesen Parameter immer auf NULL fest, und rufen Sie Daten in der Rückruffunktion ab. Dies kann zu einem Speicherfehler führen.
Rückgabewert
Gibt TRUE zurück, wenn die Funktion erfolgreich ist, oder andernfalls FALSE . Rufen Sie GetLastError auf, um erweiterte Fehlerdaten zu erhalten. Zu den zurückgegebenen Fehlercodes gehören die folgenden.
Fehlercode | BESCHREIBUNG |
---|---|
|
Die Verbindung mit dem Server wurde zurückgesetzt oder beendet, oder es wurde ein inkompatibles SSL-Protokoll gefunden. Beispielsweise unterstützt WinHTTP Version 5.1 SSL2 nur, wenn der Client dies ausdrücklich aktiviert. |
|
Der angeforderte Vorgang kann nicht abgeschlossen werden, da sich das angegebene Handle nicht im richtigen Zustand befindet. |
|
Der Typ des angegebenen Handles ist für diesen Vorgang falsch. |
|
Ein interner Fehler ist aufgetreten. |
|
Der Vorgang wurde abgebrochen, in der Regel, weil das Handle, für das die Anforderung ausgeführt wurde, vor Abschluss des Vorgangs geschlossen wurde. |
|
Timeout für die Anforderung. |
|
Es war nicht genügend Arbeitsspeicher verfügbar, um den angeforderten Vorgang abzuschließen. (Windows-Fehlercode) |
Hinweise
Auch wenn WinHTTP im asynchronen Modus verwendet wird (d. h. wenn WINHTTP_FLAG_ASYNC in WinHttpOpen festgelegt wurde), kann diese Funktion entweder synchron oder asynchron ausgeführt werden. Wenn FALSE zurückgegeben wird, ist ein Fehler aufgetreten, und Sie können GetLastError aufrufen, um erweiterte Fehlerinformationen zu erhalten. Wenn TRUE zurückgegeben wird, verwenden Sie die WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE Abschluss, um zu bestimmen, ob diese Funktion erfolgreich war, und den Wert der Parameter. Die WINHTTP_CALLBACK_STATUS_REQUEST_ERROR Vervollständigung gibt an, dass der Vorgang asynchron abgeschlossen wurde, aber fehlgeschlagen ist.
Die Datenmenge, die verbleibt, wird erst dann neu berechnet, wenn alle verfügbaren Daten gelesen werden, die durch den Aufruf von WinHttpQueryDataAvailable angegeben werden.
Verwenden Sie den Rückgabewert von WinHttpReadData , um zu bestimmen, wann eine Antwort vollständig gelesen wurde.
Wenn eine status Rückruffunktion mit WinHttpSetStatusCallback installiert wurde, zeigen die Benachrichtigungen der folgenden Benachrichtigungen, die im dwNotificationFlags-Parameter von WinHttpSetStatusCallback festgelegt wurden, den Fortschritt bei der Suche nach verfügbaren Daten an:
- WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
- WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
- WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
Beispiele
Das folgende Beispiel zeigt, wie Sie mithilfe der Semantik sicherer Transaktionen eine Ressource von einem HTTPS-Server herunterladen. Der Beispielcode initialisiert die WinHTTP-API, wählt einen HTTPS-Zielserver aus, öffnet und sendet eine Anforderung für diese sichere Ressource.
WinHttpQueryDataAvailable wird mit dem Anforderungshandle verwendet, um zu bestimmen, wie viele Daten zum Herunterladen verfügbar sind. Anschließend wird WinHttpReadData verwendet, um diese Daten zu lesen. Dieser Vorgang wird wiederholt, bis das gesamte Dokument abgerufen und angezeigt wurde.
Wichtig
Wenn Sie einige Daten so schnell wie möglich benötigen (d. h., Sie verarbeiten und analysieren Daten beim Empfang), sollten Sie WinHttpQueryDataAvailable und WinHttpReadData aufrufen. Wenn Sie versuchen, die gesamte Antwort so schnell wie möglich herunterzuladen, rufen Sie WinHttpReadData direkt auf, da WinHttpReadData versucht, den Puffer vor abschluss zu füllen.
Außerdem wird im folgenden Codebeispiel jede Schleifeniteration zugeordnet. Bei Produktionscode, bei dem die Leistung wichtig ist, können Sie stattdessen mit einem Puffer mit angemessener Größe (vielleicht 1 Megabyte) beginnen und die Größe bei Bedarf ändern. In der Praxis gibt WinHttpQueryDataAvailable nicht mehr als 8 KB zurück.
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);
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP, Windows 2000 Professional mit SP3 [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003, Windows 2000 Server mit SP3 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | winhttp.h |
Bibliothek | Winhttp.lib |
DLL | Winhttp.dll |
Verteilbare Komponente | WinHTTP 5.0 und Internet Explorer 5.01 oder höher unter Windows XP und Windows 2000. |