MFC 获取网站信息

来源:互联网 发布:windows最多分区多少 编辑:程序博客网 时间:2024/05/01 16:29
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;
}


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

另外拓展下:如何获取网站图片?

按照上面同样的方法,直接获取图片链接;不过在存储图片的时候要注意下:

CStdioFile cfile;

cfile.Open("test.jpg",CFile::modeCreate | CFile::modeWrite |CFile::typeBinary);

while((len = file->Read((void *)sRecived,RECVBUFF_SIZE)) != 0)

{

all += len;

cfile.Write((void *)sRecived,len);

memset(sRecived,0x00,RECVBUFF_SIZE);

}

session.Close();

file->Close();

delete file;

cfile.Close();

在打开文件的时候,一定要以二进制文件CFile::typeBinary的格式进行打开,不然存储的图片会失真很大!



0 0