InternetReadFile 函数 (wininet.h)

InternetOpenUrl、FtpOpenFileHttpOpenRequest 函数打开的句柄读取数据。

语法

BOOL InternetReadFile(
  [in]  HINTERNET hFile,
  [out] LPVOID    lpBuffer,
  [in]  DWORD     dwNumberOfBytesToRead,
  [out] LPDWORD   lpdwNumberOfBytesRead
);

参数

[in] hFile

从以前调用 InternetOpenUrlFtpOpenFileHttpOpenRequest 返回的句柄

[out] lpBuffer

指向接收数据的缓冲区的指针。

[in] dwNumberOfBytesToRead

要读取的字节数。

[out] lpdwNumberOfBytesRead

指向接收读取字节数的变量的指针。 InternetReadFile 在执行任何工作或错误检查之前将此值设置为零。

返回值

如果成功,则返回 TRUE ,否则返回 FALSE 。 要获得更多的错误信息,请调用 GetLastError。 应用程序还可以在必要时使用 InternetGetLastResponseInfo

注解

InternetReadFile 的运行方式与基本 ReadFile 函数非常类似,但有一些例外情况。 通常, InternetReadFile 以字节顺序流的形式从 HINTERNET 句柄检索数据。 每次调用 InternetReadFile 时要读取的数据量由 dwNumberOfBytesToRead 参数指定,数据在 lpBuffer 参数中返回。 正常读取为每次调用 InternetReadFile 检索指定的 dwNumberOfBytesToRead,直到到达文件末尾。 为了确保检索所有数据,应用程序必须继续调用 InternetReadFile 函数,直到该函数返回 TRUElpdwNumberOfBytesRead 参数等于零。 如果请求的数据写入缓存,这一点尤其重要,因为否则缓存将无法正确更新,下载的文件也不会提交到缓存。 请注意,除非打开数据流的原始请求设置了 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

注意 WinINet 不支持服务器实现。 此外,不应从服务使用它。 对于服务器实现或服务,请使用 Microsoft Windows HTTP Services (WinHTTP)
 

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 wininet.h
Library Wininet.lib
DLL Wininet.dll

另请参阅

常用函数

WinINet 函数