/*============================说明部分=================================
实现一下函数需包含头文件
#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
==============================================================================*/
http://blog.csdn.net/u012108436/article/details/50719446
转载于:https://www.cnblogs.com/nightnine/p/7851335.html
相关资源:各显卡算力对照表!