这篇文章的内容能够简单总结例如以下:

  1. WinINet函数创建和使用类型为HINTERNET的句柄
  2. HINTERNET句柄不能与其它类型的句柄互换使用
  3. InternetCloseHandle关闭HINTERNET句柄
  4. 有多种类型的HINTERNET句柄,它们形成一个树结构,例如以下图所看到的:

图中带阴影的方框创建的HINTERNET句柄被下一级的函数使用;背景空白的方框不创建HINTERNET句柄,仅使用上一级函数创建的句柄。HttpSendRequestHttpSendRequestExHttpEndRequest有些特殊,它们的下层函数不是使用它们创建的HINTERNET句柄,而是HttpOpenRequest创建的句柄,在调用这三个函数后,就能够调用下一级的函数了。

本节包括用于WinINet函数的句柄,以及它们的层次结构的信息。

关于HINTERNET句柄

WinINet函数创建和使用类型为HINTERNET的句柄。HINTERNET句柄不能与其它类型的句柄互换。因此,HINTERNET句柄不能用于ReadFile或者CloseHandle等函数。相同地,其它类型的句柄也不能用于WinINet函数。比方说,CreateFile返回的句柄不能传递给InternetReadFile

InternetCloseHandle函数用于关闭HINTERNET句柄。注意,句柄值非常快被回收重用。因此,假设关闭一个句柄,然后马上生成一个新句柄,则新句柄的值非常可能与刚被关闭句柄的值同样。

句柄层次结构

HINTERNET句柄形成了一个树结构。InternetOpen函数返回的句柄是树的根节点,InternetConnect函数返回的句柄则占有下一级,而FtpOpenFileFtpFindFirstFileHttpOpenRequestGopherOpenFileGopherFindFirstFile函数返回的句柄则是叶子节点。

下图展示了HINTERNET句柄的层次结构。图中每一个方框代表返回HINTERNET句柄的一个函数。

最顶层的是InternetOpen函数,它创建根节点。下一层包含InternetOpenUrlInternetConnect函数。组成了最后一层的是使用InternetConnect返回的句柄的函数。

下图展示了依赖于由InternetOpenUrl创建的句柄的函数。带阴影的方框代表返回HINTERNET句柄的函数,而空白方框代表使用HINTERNET句柄的函数。

InternetQueryDataAvailableInternetReadFileInternetSetFilePointer函数使用InternetOpenUrl创建的HINTERNET句柄。

FTP层次结构

下图展示了依赖于InternetConnect返回的FTP会话句柄的FTP函数。带阴影的方框代表返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。

FtpCreateDirectoryFtpDeleteFileFtpGetCurrentDirectoryFtpGetFileFtpPutFileFtpRemoveDirectoryFtpRenameFileFtpSetCurrentDirectory函数都使用InternetConnect创建的HINTERNET句柄。

下图展示了返回句柄的两个FTP函数,以及依赖于它们的函数。带阴影的方框代表返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。

InternetFindNextFile函数依赖于FtpFindFirstFile创建的句柄;而InternetReadFileInternetWriteFile使用FtpOpenFile创建的句柄。

Gopher层次结构

下图显示了用于Gopher协议的函数。带阴影的方框表示返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。

GopherGetAttribute函数依赖于InternetConnect创建的句柄。InternetFindNextFile使用GopherFindFirstFile创建的句柄。GopherOpenFile创建的句柄被InternetQueryDataAvailableInternetReadFile使用。

HTTP层次结构

下图显示了用于HTTP协议的函数。带阴影的方框表示返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。

HttpAddRequestHeadersHttpQueryInfoHttpSendRequestHttpSendRequestExInternetErrorDlg函数依赖于HttpOpenRequest创建的句柄。

下图展示了使用由HttpOpenRequest创建、然后被HttpSendRequest发送的句柄的函数。带阴影的方框表示返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。

HttpOpenRequest返回的句柄被HttpSendRequest使用后,就能够被InternetQueryDataAvailableInternetReadFileInternetSetFilePointer使用了。

HttpOpenRequest返回的句柄,在被HttpSendRequestEx使用后,就能够被HttpEndRequestInternetReadFileExInternetWriteFile使用了。调用HttpEndRequest之后,句柄能够被InternetReadFileInternetSetFilePointerInternetQueryDataAvailable使用。