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.

link-text

Nur eine kleine Bemerkung, die auf Ihre dynamische Zuweisung von Speicher - ordnen Sie es wie 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

Schreibe einen Kommentar