Sé cómo descargar una página html/txt. Por ejemplo:¿Cómo descargar un archivo con WinHTTP en C/C++?
//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();
Cuando trato de descargar una imagen, me sale sólo las primeras líneas del archivo y ningún mensaje de error. El problema parece estar relacionado con este parámetro (ppwszAcceptTypes) en la función WinHttpOpenRequest.
Solo un pequeño comentario sobre su asignación dinámica de memoria: lo asigna como 'pszOutBuffer = new char [dwSize + 1];' y después de eso, comprueba el puntero. No debe hacerlo, porque el nuevo operador arrojará una excepción en el caso de falta de memoria de manera predeterminada. Para evitarlo, debe suministrar 'std :: nothrow' al nuevo operador como este' pszOutBuffer = new (std :: nothrow) char [dwSize + 1]; '- en ese caso el puntero será nulo si falta de la memoria –
Importe la biblioteca msxml6. Se envía con (vista tal vez? Win7 con seguridad y más) y es instalable en XP. Inicie COM y cree un objeto IXMLHTTPRequest y envíe una solicitud. Mucho más fácil que las bibliotecas WinHttp y los certámenes de malabares. https://msdn.microsoft.com/en-us/library/ms759148(v=vs.85).aspx – jmucchiello