Wie Sie eine Datei herunterladen, die mit WinHTTP in C/C++?
Ich wissen, wie zum download einer html - /txt-Seite. Zum Beispiel :
//Variables
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
vector <string> vFileContent;
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"nytimes.com",
INTERNET_DEFAULT_HTTP_PORT, 0);
//Create an HTTP request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"GET", L"/ref/multimedia/podcasts.html",
NULL, WINHTTP_NO_REFERER,
NULL,
NULL);
//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);
//Keep checking for data until there is nothing left.
if (bResults)
do
{
//Check for 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", pszOutBuffer);
//Data in vFileContent
vFileContent.push_back(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 any open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
//Write vFileContent to file
ofstream out("test.txt",ios::binary);
for (int i = 0; i < (int) vFileContent.size();i++)
out << vFileContent[i];
out.close();
Wenn ich versuche, ein Foto runterzuladen, bekomme ich nur die ersten Zeilen der Datei an und keine Fehlermeldung. Das problem scheint im Zusammenhang zu diesem parameter (ppwszAcceptTypes) in WinHttpOpenRequest Funktion.
Nur eine kleine Bemerkung, die auf Ihre dynamische Zuweisung von Speicher - ordnen Sie es wie
Importieren Sie die msxml6-Bibliothek. Es Schiffe mit (vista vielleicht? win7 ist sicher) und ist installible auf XP. Initiieren COM und erstellen Sie eine IXMLHTTPRequest-Objekt und eine Anfrage zu senden. Viel einfacher, als WinHttp-Bibliotheken und Jonglier-certs. msdn.microsoft.com/en-us/library/ms759148(v=vs. 85).aspx
pszOutBuffer = new char[dwSize+1];
und danach überprüfen der Zeiger. Sie sollten nicht, weil der new-operator eine exception werfen, in dem Fall der Speicher fehlt standardmäßig. Um zu verhindern, dass es zu Ihnen liefern sollte std::nothrow
zu den new-operator, wie in diesem pszOutBuffer = new(std::nothrow) char[dwSize+1];
- in diesem Fall der Zeiger wird null, wenn es einen Mangel an Speicher.Importieren Sie die msxml6-Bibliothek. Es Schiffe mit (vista vielleicht? win7 ist sicher) und ist installible auf XP. Initiieren COM und erstellen Sie eine IXMLHTTPRequest-Objekt und eine Anfrage zu senden. Viel einfacher, als WinHttp-Bibliotheken und Jonglier-certs. msdn.microsoft.com/en-us/library/ms759148(v=vs. 85).aspx
InformationsquelleAutor | 2009-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie in diesem thread auf der MSDN-Website ist die gleiche und hat die Lösung
http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/45ccd91c-6794-4f9b-8f4f-865c76cc146d
InformationsquelleAutor Lou Franco
Lösung :
InformationsquelleAutor
Nur öffnen ofstream im Binär-Modus nicht ändern die Art und Weise, die << Betreiber arbeiten - Sie werden immer perfform formatierte Ausgabe. Sie müssen den stream schreiben () - Funktion, die funktioniert unformatiert ausgegeben.
InformationsquelleAutor