webBrowser 应用编程函数总结

文中有一部分是我编程过程中遇到问题百度,google而的,当然大部分是我自己写的或我优化别人的,在此记录,方便以后查阅。

/*============================说明部分=================================
 实现一下函数需包含头文件
#include <Wininet.h>
#include <Shlwapi.h>
Linker : Wininet.lib  Shlwapi.lib
=================================================================*/
/*========================================END========================================*/

/*============================说明部分=================================
清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com
=================================================================*/
BOOL CleanUrlCache(LPCTSTR lpUrl)
{
	LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;
	DWORD dwSize = 0;
	HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);
	if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
		return FALSE;

	lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
	hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);
	if (hFind == NULL)
	{
		delete lpICEI;
		return FALSE;
	}

	do 
	{
		if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))
		{
			int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);
		}
		delete lpICEI;
		lpICEI = NULL;
		dwSize = 0;

		if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
			break;
		lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
	} while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize));

	if (lpICEI != NULL)
		delete lpICEI;
	return TRUE;
}
/*========================================END========================================*/




/*============================说明部分=================================
清除IE所有Cookie
#include <Wininet.h>
Linker : Wininet.lib
=================================================================*/
void   ClearInternetCache()   
{   
	DWORD   dwNeeded   =   0;   
	FindFirstUrlCacheEntry(NULL,   NULL,   &dwNeeded);  

	if   (GetLastError()   ==   ERROR_INSUFFICIENT_BUFFER)   
	{   
		unsigned   char   *buffer   =   new   unsigned   char[dwNeeded];   
		try   
		{   
			LPINTERNET_CACHE_ENTRY_INFO   lpicei   =   
				reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);   
			HANDLE   HFind   =     FindFirstUrlCacheEntry(NULL,   lpicei,   &dwNeeded);   
			DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);  

			bool   no_more_files   =   false;   
			while   (!no_more_files)   
			{   
				if   (FindNextUrlCacheEntry(HFind,   lpicei,   &dwNeeded))   
				{   
					DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);   
				}   
				else   switch   (GetLastError())   
				{   
case   ERROR_INSUFFICIENT_BUFFER:   
	{   
		delete   []   buffer;   
		buffer   =   new   unsigned   char[dwNeeded];   
		lpicei   =   reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);   
		break;   
	}   
default:   
	{   
		no_more_files   =   true;   
		break;   
	}   
				}   
			}
			FindCloseUrlCache(HFind);
		}   
		catch   (...)   
		{   
			delete   []   buffer;   
		}   
		delete   []   buffer;                   
	}   
}

/*========================================END========================================*/

/*============================说明部分=================================
CString 转换为 VARIANT 类型
=================================================================*/
StringToVariant(CString str)
{
	VARIANT variant;
	VariantInit(&variant);
	variant.vt=VT_BSTR;
	variant.bstrVal=str.AllocSysString();

	return variant;
}
/*========================================END========================================*/

/*============================说明部分=================================
打开指定URL,其中m_webBrowser 是web browser
控件关联的控件类型的变量
=================================================================*/
OpenURL(LPCTSTR strURL)
{
	VARIANT vInfo;
	VariantInit(&vInfo);
	CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");
	VARIANT vHeaders=StringToVariant(strHeaders);
	m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);
}
/*========================================END========================================*/




/*============================说明部分=================================
向指定ID的HTML标记中输入文字
strID为标记的ID值 
#include <mshtml.h>
#include <atlbase.h>
=================================================================*/
InputText(CString strID, CComVariant strText)
{
	HRESULT hr;

	IDispatch *pDisp;
	pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口

	IHTMLDocument2* pDoc;
	hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口
	
	IHTMLElementCollection* pColl=NULL;
	hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合

	IDispatch *pDisp2;
	VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口
	//V_VT(&index)=VT_I4;
	//V_I4(&index)=0;
	index.vt=VT_I4;
	index.lVal=0;

	VARIANT varID;//要查找的HTML标记ID
	varID=StringToVariant(strID);

	hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
	if(S_OK==hr&&NULL!=pDisp2)
	{
		IHTMLElement* pElem=NULL;
	    hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);

		if(S_OK==hr&&NULL!=pElem)
		{
			pElem->put_innerText(strText.bstrVal);
			pElem->Release();
		}
		pDisp2->Release();
		pDisp->Release();
	}
}
/*========================================END========================================*/
/*============================说明部分=================================
点击指定ID值的HTML按钮
strID是按钮的ID值
#include <mshtml.h>
#include <atlbase.h>
=================================================================*/
ClickBtn(CString strID)
{
	HRESULT hr;
	IDispatch* pDisp;
	pDisp=m_webBrowser.get_Document();//①得到网页控件接口

	IHTMLDocument2* pDoc;
	hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口

	IHTMLElementCollection* pColl=NULL;
	hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口

	IDispatch* pDisp2;
	VARIANT index;
	//V_VT(&index)=VT_I4;
	//V_I4(&index)=0;
	index.vt=VT_I4;
	index.lVal=0;

	VARIANT varID;
	varID=StringToVariant(strID);

	hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口

	if(S_OK==hr&&NULL!=pDisp2)
	{
		IHTMLElement* pElem=NULL;
		hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口

		if(S_OK==hr&&NULL!=pElem)
		{
			pElem->click();
			pElem->Release();
		}
		pDisp2->Release();
		pDisp->Release();
	}
}
/*========================================END========================================*/
/*===============================================================
根据页面Class属性值点击页面元素
=================================================================*/
void CPiLiangQianDaoDlg::ClickByClassName()
{
	IHTMLElementCollection   *objAllElement=NULL; 
	IHTMLDocument2   *objDocument=NULL; 

	objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document(); 
	//由控件得到IHTMLDocument2接口指针

	objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合

	IHTMLElement   *   pElem   =   NULL;   
	VARIANT   name; 
	CComBSTR   tag; 
	long     a; 
	objAllElement-> get_length(&a); 
	name.vt=VT_I4;
	for(int   i=0;i <a;i++)//遍历所有元素
	{ 
		name.lVal   =   i; 
		IDispatch   *   pDispatch=NULL; 
		objAllElement-> item(name,name,&pDispatch); 
		IHTMLElement*   spElement; 
		pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement); 
		BSTR   tag; 
		spElement->get_className(&tag); 
		CString   ss(tag); 
		if(ss == "j_signbtn sign_btn2 j_cansign sign0" || ss == "j_signbtn sign_btn2 j_cansign sign1" || ss == "j_signbtn sign_btn2 j_cansign sign6") 
			spElement-> click(); 
	} 
/*=====================================================================================*/
/*=====================================================================================
根据网页打开的进程设置进度条
给web browser添加OnProgressChange响应函数
m_procCtrl是进度条关联的控件变量
=======================================================================*/
if(ProgressMax>0)
	m_procCtrl.SetPos(100*Progress / ProgressMax);
//========================================

/*====================================================================
搜索点击页面文字连接
Str为文字
=======================================================================*/
ClickItem(CString str)
{
    IHTMLElementCollection   *objAllElement=NULL; 
    IHTMLDocument2   *objDocument=NULL; 
        
   objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document(); 
   //由控件得到IHTMLDocument2接口指针

    objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合

    IHTMLElement   *   pElem   =   NULL;   
    VARIANT   name; 
    CComBSTR   tag; 
    long     a; 
    objAllElement-> get_length(&a); 
    name.vt=VT_I4;
	for(int   i=0;i <a;i++)//遍历所有元素
	{ 
      	name.lVal   =   i; 
		IDispatch   *   pDispatch=NULL; 
		objAllElement-> item(name,name,&pDispatch); 
		IHTMLElement*   spElement; 
		pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement); 
		BSTR   tag; 
		spElement-> get_outerText(&tag); 
		CString   ss(tag); 
		if(ss=="地图") 
			spElement-> click(); 
	} 
}
/*=====================================================================================*/
/*=======================================================================================
在DocumentCompleteExplorer判断是否为主框架加载完毕
在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void   CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH   pDisp,   VARIANT   FAR*   URL) 
加入下面代码: 
======================================================================================*/CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2; pWeb   =   pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if   (m_ie.GetDocument()   !=   pDoc2)   return;
/*==========================================================================*/


/*======================================================================
   判断网页是否加载完毕
========================================================================*/
void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)
{
	// TODO: 在此处添加消息处理程序代码
	if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == 0) 
	{
	 ((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));
	 m_IsInitDone = 1;
	 times++;
	}
}	
/*======================================================================================
 截取网页部分内容,并画图显示
======================================================================================*/
{
CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO));

    HRESULT hr;

	IDispatch *pDisp;
	pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口

	IHTMLDocument2* pDoc;
	hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口
	
	IHTMLElementCollection* pColl=NULL;
	hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合

	IDispatch *pDisp2;
	VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口
	//V_VT(&index)=VT_I4;
	//V_I4(&index)=0;
	index.vt=VT_I4;
	index.lVal=0;

	VARIANT varID;//要查找的HTML标记ID
	varID=StringToVariant(_T("userlike_info_head_img"));

	hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
	if(S_OK==hr&&NULL!=pDisp2)
	{
		IHTMLElement3* pElem=NULL;
	    hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);
		IHTMLElementRender *pRender =  NULL;  
		pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);  
		pRender->DrawToDC(hImageDC);
	}
}
/*=================================================================================*/

/*=================================================================================
判断网页是否加在完全(包含框架)
原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕!
=====================================================================================*/
void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
{
	// TODO: 在此处添加消息处理程序代码
	CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb; 
	CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2; 
	pWeb   =   pDisp; 
	pWeb-> get_Document((IDispatch**)&pDoc2); 
	if   (m_webBrowser.get_Document()   ==   pDoc2)   
	{
          ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
	}
	/////////////////////////////////////////
	/*if(0==m_count)
	{
		((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
		m_count++;
	}*/
}
/*=============================================================================*/
/*==============================================================================
 另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE
==============================================================================*/




你可能感兴趣的:(编程,cache,null,delete,buffer,WebBrowser)