文中有一部分是我编程过程中遇到问题百度,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 ==============================================================================*/