使用WinInet下载网页源码

具体代码见http://www.dotnetheaven.com/uploadfile/mahesh/commonwininetapi05242005064319am/commonwininetapi.aspx,这里只分析一下完整的流程。

void COpenUrlDlg::OnOk() 

{

UpdateData(TRUE);

if ( m_strURL.IsEmpty() )

return;

HINTERNET hINet, hFile;     //1

hINet = InternetOpen("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );     //2

if ( !hINet )

{

AfxMessageBox("InternetOpen Failed");

return;

}

hFile = InternetOpenUrl( hINet, m_strURL, NULL, 0, 0, 0 ) ; //3

if ( hFile )

{

CHAR buffer[1024];

DWORD dwRead;

while ( InternetReadFile( hFile, buffer, 1023, &dwRead ) ) //4

{

if ( dwRead == 0 )

break;

buffer[dwRead] = 0;

m_strContents += buffer;

}

InternetCloseHandle( hFile ); //5

}

InternetCloseHandle( hINet ); //6

UpdateData(FALSE);} 

 1)句柄仅仅是一种特殊的数据类型(智能指针)罢了。HINTERNET也不例外。大多数WinInet函数都可以使用HINTERNET类型的句柄来实现它的操作。因为HINTERNET是WinInet的专用句柄类型,所以它并不能与其他句柄类型之间进行转化,所以我们也不应该使用ReadFile,closeHandle之类的函数来操作句柄

   2)由InternetOpen函数返回的句柄是一个“根句柄”,它唯一的标识了一个会话。

     第一个参数:

只是指定了应用程序的名字,可以随便写的,网络上很多错误的或者不明确的说法。在使用HTTP协议时,这个名字将作为“用户代理项”,而这个用户代理项只是让服务器知道是谁对它发起了资源请求,以便发生错误时服务器商可以与客户端进行协商解决问题。

      第二个参数:

访问类型,可取下列值:

INTERNET_OPEN_TYPE_DIRECT 解析所有本地主机

INTERNET_OPEN_TYPE_PRECONFIG 返回注册表中代理或直接的配置;(其实,如果注册表中没有代理一项,那么此值与第一个的作用一样)

INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 返回注册表中代理或直接的配置,并防止对Microsoft Jscript 或 INS文件的使用;

INTERNET_OPEN_TYPE_PROXY 为代理传递请求,除非代理提供了旁路列表且解析的名字可以绕过代理;此时,函数使用INTERNET_OPEN_TYPE_DIRECT。

    第三个参数:

指定了当lAccessType类型为INTERNET_OPEN_TYPE_PROXY时,代理服务器的名字。

如果lAccessType类型未被设置为INTERNET_OPEN_TYPE_PROXY,该参数将被忽略且为NULL。

    第四个参数:

指向一个字符串,它指定一个可选的主机名列表或IP地址,列表可包括未知元素。

这个参数内的内容必须是不能被代理路由到的IP或主机列表。换句话说如果没有使用代理,那么这个参数应设置为NULL

    第五个参数:

该参数可为下列值的任意组合:

  INTERNET_FLAG_ASYNC 仅能用于作用在该函数返回的句柄的子句柄上的异步请求。

  INTERNET_FLAG_FROM_CACHE 不做网络请求。所有的实体都由缓存返回。如果请求条目不在缓存中,一个适当的错误将返回。

  INTERNET_FLAG_OFFLINE 与 INTERNET_FLAG_FROM_CACHE 一样。

  3)InternetOpenURL根据我们给定的URL去请求一个资源。第一个参数是上面得到的句柄,第二个参数是URL地址(必须指明协议类型,不能只指定www.iloveu.com,要在前面加上http://),其他参数就先不了解了。它将返回一个Handle指向URL

  4)InternetReadFile的参数就很明白了。只要注意最后一个参数,类型为LPDWORD,所以,在上文中必须使用&来获取DWORD的地址,它的意思是保存接收的数据字节数。

5,6)即释放句柄资源,无需赘述。

  接下来,要对这个程序进行一下扩展了,不想使用MFC.

你可能感兴趣的:(ini)