zoukankan      html  css  js  c++  java
  • MFC网页访问的实现示例

    本示例使用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] = '';
    	delete []ab;
    	
    	CString temp(big);
    
    	result.Format("The return code(返回值): %d
     %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;
    



  • 相关阅读:
    [rabbitmq] python版本(二) 工作队列
    [rabbitmq] python版本(一)HelloWorld
    rabbitmq安装上手
    leetcode1 两数之和
    mybatis学习笔记(一)入门上手
    神经网络简介
    hexo+github pages搭建个人博客
    简单RTSCamera实现
    数据结构复习:树
    LINQ
  • 原文地址:https://www.cnblogs.com/riskyer/p/3268710.html
Copyright © 2011-2022 走看看