虽然经常使用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对象。
|
|
|