本示例使用MFC 类CInternetSession 建立连接,使用 CHttpFile读取内容。
首先,建立一个MFC对话框项目,界面如下:
1. 添加头文件:
#include <afxinet.h>
2. UTF-8 转 UNICODE:
int cU8xU(wchar_t* pOut,char *pText)
{
int ret = 0;
char* uchar = (char *)pOut;
unsigned cIn = (unsigned char)pText[0];
if(cIn<0x80){ // ASCII 0x00 ~ 0x7f
pOut[0] = pText[0];
}else if(cIn<0xdf){
uchar[0] = (pText[0]<<6)|(pText[1]&0x3f);
uchar[1] = (pText[0]>>2)&0x0f;
ret = 1;
}else if(cIn<=0xef){
uchar[0] = (pText[1]<<6)|(pText[2]&0x3f);
uchar[1] = (pText[0]<<4)|((pText[1]>>2)&0x0f);
ret = 2;
}else if(cIn<0xf7){
uchar[0] = (pText[2]<<6)|(pText[3]&0x3f);
uchar[1] = (pText[1]<<4)|((pText[2]>>2)&0x0f);
uchar[2] = ((pText[0]<<2)&0x1c)|((pText[1]>>4)&0x03);
ret = 3;
}
return ret;
}
int sU8xU(WCHAR* pOut,char *pText,int Len){
int i,j;
for(i=0,j=0;i<Len;i++,j++){
i+=cU8xU(&pOut[j],&pText[i]);
}
return j;
}
3. 加入按键响应函数:
void CURL_TESTDlg::OnBnClickedButton1()
{
//#include <afxinet.h>
CString url;
GetDlgItem(IDC_EDIT1)->GetWindowText(url);
DWORD code = 0;
CInternetSession httpSession ;
CHttpFile * htmlFile=NULL ;
try{
//打开网页
htmlFile=(CHttpFile*)httpSession.OpenURL(_T("http://www.sogou.com/"));
//htmlFile=(CHttpFile*)httpSession.OpenURL(url);
htmlFile->QueryInfoStatusCode(code);
}catch(...)
{
MessageBox(_T("err"),_T("BE"),1); // 如果断网而打不开这个网址,并且不抓取这个错误,就会弹出一个提示系统提示框!这里我自己处理。
return;
}
//读取网页数据
CString str;
CString info=_T("");
while(htmlFile->ReadString(str))
{
info+=str ;
}
//释放
htmlFile->Close();
httpSession.Close();
//显示
CString result;
int length = info.GetLength();
char *ab = new char[length];
memset(ab, 0, length);
memcpy(ab, info.GetBuffer(), length);
WCHAR *big = new WCHAR[length];
memset(big, 0, length);
int len = sU8xU(big, ab, length);
big[len] = '\0';
delete []ab;
CString temp(big);
result.Format("The return code(返回值): %d\r\n %s", code, temp.GetBuffer());
GetDlgItem(IDC_EDIT2)->SetWindowText(result);
//delete []big; // i don't how to do for this.
}
4. 另外也可以使用这段粗糙的代码实现这个功能:
CInternetSession mysession;
CHttpConnection *myconn=mysession.GetHttpConnection("www.veno2.com");
CHttpFile *myfile=myconn->OpenRequest("GET","/ag_list");
myfile->SendRequest();
CString mystr;
CString tmp;
while(myfile->ReadString(tmp))
{
mystr+=tmp;
}
//GetDlgItem(IDC_EDIT2)->SetWindowText(mystr);
myfile->Close();
myconn->Close();
mysession.Close();
delete myfile;
delete myconn;
myfile=0;
myconn=0;