MFC 读取网页源码

来源:互联网 发布:java反序列化漏洞利用 编辑:程序博客网 时间:2024/05/01 23:23

 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;

}

最后,得到的字符串就可以正常显示了。。。。

原创粉丝点击