Функция InternetReadFile (wininet.h)
Считывает данные из дескриптора, открытого функцией InternetOpenUrl, FtpOpenFile или HttpOpenRequest .
Синтаксис
BOOL InternetReadFile(
[in] HINTERNET hFile,
[out] LPVOID lpBuffer,
[in] DWORD dwNumberOfBytesToRead,
[out] LPDWORD lpdwNumberOfBytesRead
);
Параметры
[in] hFile
Дескриптор, возвращенный при предыдущем вызове InternetOpenUrl, FtpOpenFile или HttpOpenRequest.
[out] lpBuffer
Указатель на буфер, который получает данные.
[in] dwNumberOfBytesToRead
Число считываемых байтов.
[out] lpdwNumberOfBytesRead
Указатель на переменную, получающую количество прочитанных байтов. InternetReadFile устанавливает это значение в нулевое значение перед выполнением какой-либо работы или проверки ошибок.
Возвращаемое значение
Возвращает значение TRUE в случае успешного выполнения или FALSE в противном случае. Дополнительные сведения об ошибке можно получить, вызвав GetLastError. Приложение также может использовать InternetGetLastResponseInfo при необходимости.
Комментарии
InternetReadFile работает так же, как базовая функция ReadFile , за некоторыми исключениями. Как правило, InternetReadFile извлекает данные из дескриптора HINTERNET в виде последовательного потока байтов. Объем данных, считываемых для каждого вызова InternetReadFile , определяется параметром dwNumberOfBytesToRead , а данные возвращаются в параметре lpBuffer . Обычное чтение извлекает указанный dwNumberOfBytesToRead для каждого вызова InternetReadFile до достижения конца файла. Чтобы гарантировать получение всех данных, приложение должно продолжать вызывать функцию InternetReadFile до тех пор, пока функция не вернет значение TRUE , а параметр lpdwNumberOfBytesRead не будет равен нулю. Это особенно важно, если запрошенные данные записываются в кэш, так как в противном случае кэш не будет обновлен должным образом, а скачанный файл не будет зафиксирован в кэше. Обратите внимание, что кэширование выполняется автоматически, если исходный запрос на открытие потока данных не устанавливает флаг INTERNET_FLAG_NO_CACHE_WRITE .
Когда приложение получает дескриптор с помощью InternetOpenUrl, WinINet пытается сделать все данные похожими на скачанный файл, чтобы упростить чтение из Интернета для приложения. Для некоторых типов сведений, таких как списки каталогов FTP-файлов, он преобразует данные для возврата
InternetReadFile в поток HTML. Он делает это построчно. Например, он может преобразовать список каталога FTP в строку HTML и вернуть этот HTML в приложение.
WinINet пытается записать HTML-код в буфер lpBuffer по строке за раз. Если буфер приложения слишком мал, чтобы вместить хотя бы одну строку созданного HTML- кода, код ошибки ERROR_INSUFFICIENT_BUFFER возвращается в качестве указания приложения на необходимость большего буфера. Кроме того, преобразованные строки могут не полностью заполнить буфер, поэтому InternetReadFile может возвращать меньше данных в lpBuffer, чем запрошено . Последующие операции чтения будут извлекать весь преобразованный HTML-код. Приложение должно снова проверка, что все данные извлекаются, как описано выше.
Как и все другие аспекты API WinINet, эту функцию нельзя безопасно вызывать из DllMain или конструкторов и деструкторов глобальных объектов.
Если при выполнении асинхронного выполнения вызов InternetReadFile не приводит к завершенной транзакции, он возвращает значение FALSE , а последующий вызов GetLastError возвращает ERROR_IO_PENDING. После завершения транзакции internetStatusCallback , указанный в предыдущем вызове InternetSetStatusCallback , будет вызываться с INTERNET_STATUS_REQUEST_COMPLETE.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Целевая платформа | Windows |
Header | wininet.h |
Библиотека | Wininet.lib |
DLL | Wininet.dll |