这篇文章的内容能够简单总结例如以下:
- WinINet函数创建和使用类型为HINTERNET的句柄
- HINTERNET句柄不能与其它类型的句柄互换使用
- 用InternetCloseHandle关闭HINTERNET句柄
- 有多种类型的HINTERNET句柄,它们形成一个树结构,例如以下图所看到的:
图中带阴影的方框创建的HINTERNET句柄被下一级的函数使用;背景空白的方框不创建HINTERNET句柄,仅使用上一级函数创建的句柄。HttpSendRequest、HttpSendRequestEx和HttpEndRequest有些特殊,它们的下层函数不是使用它们创建的HINTERNET句柄,而是HttpOpenRequest创建的句柄,在调用这三个函数后,就能够调用下一级的函数了。
本节包括用于WinINet函数的句柄,以及它们的层次结构的信息。
关于HINTERNET句柄
WinINet函数创建和使用类型为HINTERNET的句柄。HINTERNET句柄不能与其它类型的句柄互换。因此,HINTERNET句柄不能用于ReadFile或者CloseHandle等函数。相同地,其它类型的句柄也不能用于WinINet函数。比方说,CreateFile返回的句柄不能传递给InternetReadFile。
InternetCloseHandle函数用于关闭HINTERNET句柄。注意,句柄值非常快被回收重用。因此,假设关闭一个句柄,然后马上生成一个新句柄,则新句柄的值非常可能与刚被关闭句柄的值同样。
句柄层次结构
HINTERNET句柄形成了一个树结构。InternetOpen函数返回的句柄是树的根节点,InternetConnect函数返回的句柄则占有下一级,而FtpOpenFile、FtpFindFirstFile、HttpOpenRequest、GopherOpenFile和GopherFindFirstFile函数返回的句柄则是叶子节点。
下图展示了HINTERNET句柄的层次结构。图中每一个方框代表返回HINTERNET句柄的一个函数。
最顶层的是InternetOpen函数,它创建根节点。下一层包含InternetOpenUrl和InternetConnect函数。组成了最后一层的是使用InternetConnect返回的句柄的函数。
下图展示了依赖于由InternetOpenUrl创建的句柄的函数。带阴影的方框代表返回HINTERNET句柄的函数,而空白方框代表使用HINTERNET句柄的函数。
InternetQueryDataAvailable、InternetReadFile和InternetSetFilePointer函数使用InternetOpenUrl创建的HINTERNET句柄。
FTP层次结构
下图展示了依赖于InternetConnect返回的FTP会话句柄的FTP函数。带阴影的方框代表返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。
FtpCreateDirectory、FtpDeleteFile、FtpGetCurrentDirectory、FtpGetFile、FtpPutFile、FtpRemoveDirectory、FtpRenameFile和FtpSetCurrentDirectory函数都使用InternetConnect创建的HINTERNET句柄。
下图展示了返回句柄的两个FTP函数,以及依赖于它们的函数。带阴影的方框代表返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。
InternetFindNextFile函数依赖于FtpFindFirstFile创建的句柄;而InternetReadFile和InternetWriteFile使用FtpOpenFile创建的句柄。
Gopher层次结构
下图显示了用于Gopher协议的函数。带阴影的方框表示返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。
GopherGetAttribute函数依赖于InternetConnect创建的句柄。InternetFindNextFile使用GopherFindFirstFile创建的句柄。GopherOpenFile创建的句柄被InternetQueryDataAvailable和InternetReadFile使用。
HTTP层次结构
下图显示了用于HTTP协议的函数。带阴影的方框表示返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。
HttpAddRequestHeaders、HttpQueryInfo、HttpSendRequest、HttpSendRequestEx和InternetErrorDlg函数依赖于HttpOpenRequest创建的句柄。
下图展示了使用由HttpOpenRequest创建、然后被HttpSendRequest发送的句柄的函数。带阴影的方框表示返回HINTERNET句柄的函数,空白方框表示使用它们所依赖的函数创建的HINTERNET句柄的函数。
由HttpOpenRequest返回的句柄被HttpSendRequest使用后,就能够被InternetQueryDataAvailable、InternetReadFile和InternetSetFilePointer使用了。
由HttpOpenRequest返回的句柄,在被HttpSendRequestEx使用后,就能够被HttpEndRequest、InternetReadFileEx和InternetWriteFile使用了。调用HttpEndRequest之后,句柄能够被InternetReadFile、InternetSetFilePointer和InternetQueryDataAvailable使用。