Comment télécharger un fichier avec WinHTTP en C/C++?

Je sais comment faire pour télécharger un fichier html/txt page. Par exemple :

//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();

Lorsque j'essaie de télécharger une photo, je ne reçois que les premières lignes du fichier et aucun message d'erreur. Le problème semble lié à ce paramètre (ppwszAcceptTypes) dans WinHttpOpenRequest Fonction.

texte du lien

Juste une petite remarque sur votre allocation dynamique de la mémoire - vous les répartir comme pszOutBuffer = new char[dwSize+1]; et après que l'enregistrement du pointeur. Vous ne devriez pas, parce que le nouvel opérateur va lever une exception en cas de manque de mémoire par défaut. Pour éviter cela, vous devez fournir std::nothrow à l'opérateur new, comme ce pszOutBuffer = new(std::nothrow) char[dwSize+1]; - dans ce cas, le pointeur est null si il y a un manque de mémoire.
Importer le msxml6 de la bibliothèque. Il est livré avec (vista peut-être? win7 pour vous et vers le haut) et est installible sur XP. Initier COM et le fait de créer une IXMLHTTPRequest objet et d'envoyer une demande. Beaucoup plus facile que de WinHttp bibliothèques et de jongler avec les certs. msdn.microsoft.com/en-us/library/ms759148(v=vs. 85).aspx

OriginalL'auteur | 2009-05-05