HINTERNET hSession = WinHttpOpen(L"UserAgent/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, NULL, NULL, 0); HINTERNET hConnect = WinHttpConnect(hSession, L"example.com", INTERNET_DEFAULT_HTTP_PORT, 0); HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/file.zip", NULL, NULL, NULL, 0); if (WinHttpSendRequest(hRequest, NULL, 0, NULL, 0, 0, 0) && WinHttpReceiveResponse(hRequest, NULL)) { DWORD dwSize = 0; do { WinHttpQueryDataAvailable(hRequest, &dwSize); BYTE* pBuffer = new BYTE[dwSize]; DWORD dwDownloaded = 0; WinHttpReadData(hRequest, (LPVOID)pBuffer, dwSize, &dwDownloaded); // Запись pBuffer в файл... delete[] pBuffer; } while (dwSize > 0); } // Закрытие дескрипторов WinHttpCloseHandle Use code with caution. Copied to clipboard Обработка ошибок и таймаутов
: Создание дескриптора сессии с помощью WinHttpOpen , где указывается User-Agent.
Процесс загрузки файла на C++ или через COM-объект в скриптовых языках (VBScript, PowerShell) строится по следующему алгоритму: Winhttp скачать файл
: Библиотека нативно поддерживает HTTP/2 и TLS 1.2/1.3 (в зависимости от версии ОС).
Использование является предпочтительным способом для скачивания файлов в серверных приложениях, системных службах и десктопных программах, где не требуется взаимодействие с пользователем через интерфейс. В отличие от WinINet, WinHTTP оптимизирован для высокой производительности и многопоточности. HINTERNET hSession = WinHttpOpen(L"UserAgent/1
: В цикле вызывается WinHttpReadData для получения содержимого файла порциями, которые затем записываются в локальный файл. Преимущества WinHTTP перед WinINet
При скачивании больших файлов важно устанавливать таймауты ( WinHttpSetTimeouts ), чтобы приложение не зависало при обрыве соединения. Также рекомендуется использовать POST-запросы , если необходимо передавать длинные параметры в URL при инициировании загрузки. HINTERNET hSession = WinHttpOpen(L"UserAgent/1.0"
: Позволяет программно настраивать параметры прокси-серверов без изменения глобальных настроек Internet Explorer.