利用WinInet开发Internet程序

  虽然经常使用CInternetSession进行下载,但是都只是简单的运用,没什么认真的去理解里面的机制。直到这两天发现,我用CInternetSession下载时,360会警告说程序正在修改一个注册表。当时有点不理解,于是呼就认真看了这个类的机制,发现CInternetSession默认的打开方式是INTERNET_OPEN_TYPE_PRECONFIG,该标志要求从注册表加载IE的配置并下载,然后在设置回注册表。原来如此,于是在找了一下,有一个直接连接的方式INTERNET_OPEN_TYPE_DIRECT。试一下,还真可以。最后,找了一编关于CInternetSession的文章于记之


1.4 利用WinInet开发Internet程序

MS所提供的WinInet开发包是作为ActiveX技术中的一部分,后来MS对WinInet API进行了包装并提供了相应的MFC类。WinNet开发包的作用是提供了对HTTP FTP Gopher协议的支持,使开发者在开发Internet程序时避免编写底层协议相关的代码。此外WinInet很多功能都是与IE有联系的,比如说可以使用IE中的设置和使用IE缓存中的数据。本节主要将内容集中在HTTP协议的使用上。

WinInet中的CInternetSession是管理会话的类,一般来讲如果要使用WinInet功能都需要建立一个会话,然后在该会话的基础上使用数据存取功能。CInternetSession的构造函数中接收四个参数

CInternetSession( LPCTSTR pstrAgent = NULL, //应用程序名,可以自己定义
	DWORD dwContext = 1, //上下文标记,如果使用回调功能时这个值将给传送给回调函数
	DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG, //
	LPCTSTR pstrProxyName = NULL, //CERN代理服务器地址,一般设置为NULL
	LPCTSTR pstrProxyBypass = NULL, //代理服务器地址
	DWORD dwFlags = 0 );//标记,一般设置为0

dwAccessType可以为:

  • INTERNET_OPEN_TYPE_PRECONFIG 使用IE中的连接设置
  • INTERNET_OPEN_TYPE_DIRECT 直接连接到服务器
  • INTERNET_OPEN_TYPE_PROXY 通过代理服务器进行连接

当dwAccessType为INTERNET_OPEN_TYPE_PROXY时指明代理服务器地址。

dwFlags可以为:

  • INTERNET_FLAG_DONT_CACHE 不在缓存中保存取得的内容
  • INTERNET_FLAG_OFFLINE 脱机方式,

在建立会话后就可以利用CInternetSession::OpenURL打开一个URL,并读取数据,函数原型为:

CStdioFile* OpenURL( LPCTSTR pstrURL, //文件URL地址
		DWORD dwContext = 1, //上下文ID
		DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, //标记
		LPCTSTR pstrHeaders = NULL, //发送到服务器的数据头
		DWORD dwHeadersLength = 0 );//发送到服务器的数据头长度
dwFlags可以为:
  • INTERNET_FLAG_RELOAD 强制重读数据
  • INTERNET_FLAG_DONT_CACHE 不保存到缓存
  • INTERNET_FLAG_TRANSFER_ASCII 使用文本数据
  • INTERNET_FLAG_TRANSFER_BINARY 使用二进制数据

OpenURL的返回值为CStdioFile文件指针,函数会根据使用的协议返回不同的文件类指针,但这些类都是CStdioFile的派生类。

URL type Returns
file:// CStdioFile*
http:// CHttpFile*
gopher:// CGopherFile*
ftp:// CInternetFile*

然后通过CStdioFile::ReadString来读取文件内容。

本文给出的例子就是利用WinInet通过HTTP协议读取网上文件。

完成这一功能的代码非常简单,当然代码中少了各种错误检测。

void CSp_14Dlg::GetURL(void)
{
	UpdateData();
	CInternetSession sess;//建立会话
	CHttpFile* pF=(CHttpFile*)sess.OpenURL(m_szURL);//打开文件
	CString szData,szAllData;
	while(pF->ReadString(szData))
	{//读取文件
		szAllData+="\r\n";
		szAllData+=szData;
	}
	pF->Close();
	sess.Close();
	m_szHTML=szAllData;
	UpdateData(FALSE);
}
下载示范代码

这里我只讲了最简单的应用,如果你需要更强的控制性或是发送表单(FORM),则需要生成CHttpConnection对象和CHttpFile对象。

posted on 2011-07-13 16:21  焰企鹅  阅读(2565)  评论(0)    收藏  举报