MFC 当中当需要获取网页源码是,可以用到 CInternetSession 类 需要包含头文件 afxinet.h
使用类CInternetSession 创建并初始化一个或多个同时的Internet 会话。如果需要,还可描述与代理服务器的连接。如果Internet连接必须在应用过程中保持着,可创建一个类CWinApp的CInternetSession成员。一旦已建立起Internet 会话,就可调用OpenURL。CInternetSession会通过调用全局函数AfxParseURL来为分析映射URL。无论协议类型如何,CInternetSession 解释URL并管理它。它可处理由URL资源“file://”标志的本地文件的请求。如果传给它的名字是本地文件,OpenURL 将返回一个指向CStdioFile对象的指针。
如果使用OpenURL在Internet服务器上打开一个URL,你可从此处读取信息。如果要执行定位在服务器上的指定的服务(例如,HTTP,FTP或Gopher)行为,必须与此服务器建立适当的连接。直接打开与指定的服务器的指定的类型的连接,请使用下列成员函数:
·GetGopherConnection | 打开与Gopher服务的连接。 |
·GetHttpConnection | 打开与HTTP服务的连接。 |
·GetFtpConnection | 打开与FTP服务的连接。 |
CInternetSession session;
CHttpFile *file = NULL;
CString
strURL =http://www.baidu.com
CString strHtml = _T(""); //存放网页数据
try
{
file =(CHttpFile*)session.OpenURL(strURL);
}
catch(CInternetException *m_pException)
{
file = NULL;
m_pException->m_dwError;
m_pException->Delete();
session.Close();
// AfxMessageBox(_T("网络连接出现问题,请检查网络"));
MessageBox("网络连接错误","提示",MB_OK);
return;
}
CString strLine;
char sRecived[1024];
if(file != NULL) {
while(file->ReadString((LPTSTR)sRecived,1024)
!=
NULL) {
strHtml += sRecived; }
}
else
{
AfxMessageBox(_T("fail"));
}
session.Close();
file->Close();
delete file; file = NULL;
得到源码后还要进行转换,因为大多数网页是utf-8 格式的,这种格式在MFC 中显示出来为乱码,所以必须转换,用ConvertUtf8ToGBK(CString &strUtf8)
void ConvertUtf8ToGBK(CString &strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}
最后,得到的字符串就可以正常显示了。。。。