How to download a file with WinHTTP in C/C++?

27,173

Looks like this thread on MSDN is the same and has the solution

http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/45ccd91c-6794-4f9b-8f4f-865c76cc146d

Share:
27,173
Admin
Author by

Admin

Updated on July 27, 2022

Comments

  • Admin
    Admin almost 2 years

    I know how to download an html/txt page. For example :

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

    When I try to download a picture, I get only the first lines of the file and no error message. The problem seems related to this parameter (ppwszAcceptTypes) in WinHttpOpenRequest Function.

    link text

  • Admin
    Admin about 15 years
    I've read this thread before, but the solution (opening the file in binary mode) didn't work for me. But I've just retried it, this time using C, not C++, and it works. So ofstream is not working with WinHttp, as far as I can tell.