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 参数中返回。 正常读取为每次调用 InternetReadFile 检索指定的 dwNumberOfBytesToRead,直到到达文件末尾。 为了确保检索所有数据,应用程序必须继续调用 InternetReadFile 函数,直到该函数返回 TRUE 且 lpdwNumberOfBytesRead 参数等于零。 如果请求的数据写入缓存,这一点尤其重要,因为否则缓存将无法正确更新,下载的文件也不会提交到缓存。 请注意,除非打开数据流的原始请求设置了 INTERNET_FLAG_NO_CACHE_WRITE 标志,否则缓存会自动发生。
当应用程序使用 InternetOpenUrl 检索句柄时,WinINet 会尝试使所有数据看起来像文件下载,以使应用程序更容易从 Internet 读取。 对于某些类型的信息,例如 FTP 文件目录列表,它会转换要由 返回的数据
InternetReadFile 到 HTML 流。 它逐行执行此操作。 例如,它可以将 FTP 目录列表转换为 HTML 行,并将此 HTML 返回到应用程序。
WinINet 尝试一次将 HTML 写入 lpBuffer 缓冲区一行。 如果应用程序的缓冲区太小,无法容纳至少一行生成的 HTML,则会返回错误代码 ERROR_INSUFFICIENT_BUFFER ,指示应用程序需要更大的缓冲区。 此外,转换后的行可能不会完全填满缓冲区,因此 InternetReadFile 返回的 lpBuffer 中的数据比请求的要少。 后续读取将检索所有转换后的 HTML。 应用程序必须再次检查,如前所述检索所有数据。
与 WinINet API 的所有其他方面一样,无法从 DllMain 或全局对象的构造函数和析构函数中安全地调用此函数。
异步运行时,如果对 InternetReadFile 的调用不会导致已完成事务,它将返回 FALSE ,并且对 GetLastError 的后续调用将返回 ERROR_IO_PENDING。 事务完成后,将使用 INTERNET_STATUS_REQUEST_COMPLETE调用 InternetSetStatusCallback 时指定的 InternetStatusCallback。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | wininet.h |
Library | Wininet.lib |
DLL | Wininet.dll |