VC++ webbrowser函数使用范例

  1. /*============================说明部分================================= 
  2.  实现一下函数需包含头文件 
  3. #include <Wininet.h> 
  4. #include <Shlwapi.h> 
  5. Linker : Wininet.lib  Shlwapi.lib 
  6. =================================================================*/  
  7. /*========================================END========================================*/  
  8.   
  9. /*============================说明部分================================= 
  10. 清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com 
  11. =================================================================*/  
  12. BOOL CleanUrlCache(LPCTSTR lpUrl)  
  13. {  
  14.     LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;  
  15.     DWORD dwSize = 0;  
  16.     HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);  
  17.     if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)  
  18.         return FALSE;  
  19.   
  20.     lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];  
  21.     hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);  
  22.     if (hFind == NULL)  
  23.     {  
  24.         delete lpICEI;  
  25.         return FALSE;  
  26.     }  
  27.   
  28.     do   
  29.     {  
  30.         if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))  
  31.         {  
  32.             int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);  
  33.         }  
  34.         delete lpICEI;  
  35.         lpICEI = NULL;  
  36.         dwSize = 0;  
  37.   
  38.         if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)  
  39.             break;  
  40.         lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];  
  41.     } while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize));  
  42.   
  43.     if (lpICEI != NULL)  
  44.         delete lpICEI;  
  45.     return TRUE;  
  46. }  
  47. /*========================================END========================================*/  
  48.   
  49.   
  50.   
  51.   
  52. /*============================说明部分================================= 
  53. 清除IE所有Cookie 
  54. #include <Wininet.h> 
  55. Linker : Wininet.lib 
  56. =================================================================*/  
  57. void   ClearInternetCache()     
  58. {     
  59.     DWORD   dwNeeded   =   0;     
  60.     FindFirstUrlCacheEntry(NULL,   NULL,   &dwNeeded);    
  61.   
  62.     if   (GetLastError()   ==   ERROR_INSUFFICIENT_BUFFER)     
  63.     {     
  64.         unsigned   char   *buffer   =   new   unsigned   char[dwNeeded];     
  65.         try     
  66.         {     
  67.             LPINTERNET_CACHE_ENTRY_INFO   lpicei   =     
  68.                 reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);     
  69.             HANDLE   HFind   =     FindFirstUrlCacheEntry(NULL,   lpicei,   &dwNeeded);     
  70.             DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);    
  71.   
  72.             bool   no_more_files   =   false;     
  73.             while   (!no_more_files)     
  74.             {     
  75.                 if   (FindNextUrlCacheEntry(HFind,   lpicei,   &dwNeeded))     
  76.                 {     
  77.                     DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);     
  78.                 }     
  79.                 else   switch   (GetLastError())     
  80.                 {     
  81. case   ERROR_INSUFFICIENT_BUFFER:     
  82.     {     
  83.         delete   []   buffer;     
  84.         buffer   =   new   unsigned   char[dwNeeded];     
  85.         lpicei   =   reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);     
  86.         break;     
  87.     }     
  88. default:     
  89.     {     
  90.         no_more_files   =   true;     
  91.         break;     
  92.     }     
  93.                 }     
  94.             }  
  95.             FindCloseUrlCache(HFind);  
  96.         }     
  97.         catch   (...)     
  98.         {     
  99.             delete   []   buffer;     
  100.         }     
  101.         delete   []   buffer;                     
  102.     }     
  103. }  
  104.   
  105. /*========================================END========================================*/  
  106.   
  107. /*============================说明部分================================= 
  108. CString 转换为 VARIANT 类型 
  109. =================================================================*/  
  110. StringToVariant(CString str)  
  111. {  
  112.     VARIANT variant;  
  113.     VariantInit(&variant);  
  114.     variant.vt=VT_BSTR;  
  115.     variant.bstrVal=str.AllocSysString();  
  116.   
  117.     return variant;  
  118. }  
  119. /*========================================END========================================*/  
  120.   
  121. /*============================说明部分================================= 
  122. 打开指定URL,其中m_webBrowser 是web browser 
  123. 控件关联的控件类型的变量 
  124. =================================================================*/  
  125. OpenURL(LPCTSTR strURL)  
  126. {  
  127.     VARIANT vInfo;  
  128.     VariantInit(&vInfo);  
  129.     CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");  
  130.     VARIANT vHeaders=StringToVariant(strHeaders);  
  131.     m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);  
  132. }  
  133. /*========================================END========================================*/  
  134.   
  135.   
  136.   
  137.   
  138. /*============================说明部分================================= 
  139. 向指定ID的HTML标记中输入文字 
  140. strID为标记的ID值  
  141. #include <mshtml.h> 
  142. #include <atlbase.h> 
  143. =================================================================*/  
  144. InputText(CString strID, CComVariant strText)  
  145. {  
  146.     HRESULT hr;  
  147.   
  148.     IDispatch *pDisp;  
  149.     pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口   
  150.   
  151.     IHTMLDocument2* pDoc;  
  152.     hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口   
  153.       
  154.     IHTMLElementCollection* pColl=NULL;  
  155.     hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合   
  156.   
  157.     IDispatch *pDisp2;  
  158.     VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口   
  159.     //V_VT(&index)=VT_I4;   
  160.     //V_I4(&index)=0;   
  161.     index.vt=VT_I4;  
  162.     index.lVal=0;  
  163.   
  164.     VARIANT varID;//要查找的HTML标记ID   
  165.     varID=StringToVariant(strID);  
  166.   
  167.     hr=pColl->item(varID,index,&pDisp2); //找到元素的位置   
  168.     if(S_OK==hr&&NULL!=pDisp2)  
  169.     {  
  170.         IHTMLElement* pElem=NULL;  
  171.         hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);  
  172.   
  173.         if(S_OK==hr&&NULL!=pElem)  
  174.         {  
  175.             pElem->put_innerText(strText.bstrVal);  
  176.             pElem->Release();  
  177.         }  
  178.         pDisp2->Release();  
  179.         pDisp->Release();  
  180.     }  
  181. }  
  182. /*========================================END========================================*/  
  183. /*============================说明部分================================= 
  184. 点击指定ID值的HTML按钮 
  185. strID是按钮的ID值 
  186. #include <mshtml.h> 
  187. #include <atlbase.h> 
  188. =================================================================*/  
  189. ClickBtn(CString strID)  
  190. {  
  191.     HRESULT hr;  
  192.     IDispatch* pDisp;  
  193.     pDisp=m_webBrowser.get_Document();//①得到网页控件接口   
  194.   
  195.     IHTMLDocument2* pDoc;  
  196.     hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口   
  197.   
  198.     IHTMLElementCollection* pColl=NULL;  
  199.     hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口   
  200.   
  201.     IDispatch* pDisp2;  
  202.     VARIANT index;  
  203.     //V_VT(&index)=VT_I4;   
  204.     //V_I4(&index)=0;   
  205.     index.vt=VT_I4;  
  206.     index.lVal=0;  
  207.   
  208.     VARIANT varID;  
  209.     varID=StringToVariant(strID);  
  210.   
  211.     hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口   
  212.   
  213.     if(S_OK==hr&&NULL!=pDisp2)  
  214.     {  
  215.         IHTMLElement* pElem=NULL;  
  216.         hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口   
  217.   
  218.         if(S_OK==hr&&NULL!=pElem)  
  219.         {  
  220.             pElem->click();  
  221.             pElem->Release();  
  222.         }  
  223.         pDisp2->Release();  
  224.         pDisp->Release();  
  225.     }  
  226. }  
  227. /*========================================END========================================*/  
  228. /*=============================================================== 
  229. 根据页面Class属性值点击页面元素 
  230. =================================================================*/  
  231. void CPiLiangQianDaoDlg::ClickByClassName()  
  232. {  
  233.     IHTMLElementCollection   *objAllElement=NULL;   
  234.     IHTMLDocument2   *objDocument=NULL;   
  235.   
  236.     objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();   
  237.     //由控件得到IHTMLDocument2接口指针   
  238.   
  239.     objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合   
  240.   
  241.     IHTMLElement   *   pElem   =   NULL;     
  242.     VARIANT   name;   
  243.     CComBSTR   tag;   
  244.     long     a;   
  245.     objAllElement-> get_length(&a);   
  246.     name.vt=VT_I4;  
  247.     for(int   i=0;i <a;i++)//遍历所有元素   
  248.     {   
  249.         name.lVal   =   i;   
  250.         IDispatch   *   pDispatch=NULL;   
  251.         objAllElement-> item(name,name,&pDispatch);   
  252.         IHTMLElement*   spElement;   
  253.         pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);   
  254.         BSTR   tag;   
  255.         spElement->get_className(&tag);   
  256.         CString   ss(tag);   
  257.         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")   
  258.             spElement-> click();   
  259.     }   
  260. /*=====================================================================================*/  
  261. /*===================================================================================== 
  262. 根据网页打开的进程设置进度条 
  263. 给web browser添加OnProgressChange响应函数 
  264. m_procCtrl是进度条关联的控件变量 
  265. =======================================================================*/  
  266. if(ProgressMax>0)  
  267.     m_procCtrl.SetPos(100*Progress / ProgressMax);  
  268. //========================================   
  269.   
  270. /*==================================================================== 
  271. 搜索点击页面文字连接 
  272. Str为文字 
  273. =======================================================================*/  
  274. ClickItem(CString str)  
  275. {  
  276.     IHTMLElementCollection   *objAllElement=NULL;   
  277.     IHTMLDocument2   *objDocument=NULL;   
  278.           
  279.    objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();   
  280.    //由控件得到IHTMLDocument2接口指针   
  281.   
  282.     objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合   
  283.   
  284.     IHTMLElement   *   pElem   =   NULL;     
  285.     VARIANT   name;   
  286.     CComBSTR   tag;   
  287.     long     a;   
  288.     objAllElement-> get_length(&a);   
  289.     name.vt=VT_I4;  
  290.     for(int   i=0;i <a;i++)//遍历所有元素   
  291.     {   
  292.         name.lVal   =   i;   
  293.         IDispatch   *   pDispatch=NULL;   
  294.         objAllElement-> item(name,name,&pDispatch);   
  295.         IHTMLElement*   spElement;   
  296.         pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);   
  297.         BSTR   tag;   
  298.         spElement-> get_outerText(&tag);   
  299.         CString   ss(tag);   
  300.         if(ss=="地图")   
  301.             spElement-> click();   
  302.     }   
  303. }  
  304. /*=====================================================================================*/  
  305. /*======================================================================================= 
  306. 在DocumentCompleteExplorer判断是否为主框架加载完毕 
  307. 在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void   CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH   pDisp,   VARIANT   FAR*   URL)  
  308. 加入下面代码:  
  309. ======================================================================================*/CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2; pWeb   =   pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if   (m_ie.GetDocument()   !=   pDoc2)   return;  
  310. /*==========================================================================*/  
  311.   
  312.   
  313. /*====================================================================== 
  314.    判断网页是否加载完毕 
  315. ========================================================================*/  
  316. void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)  
  317. {  
  318.     // TODO: 在此处添加消息处理程序代码   
  319.     if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == 0)   
  320.     {  
  321.      ((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));  
  322.      m_IsInitDone = 1;  
  323.      times++;  
  324.     }  
  325. }     
  326. /*====================================================================================== 
  327.  截取网页部分内容,并画图显示 
  328. ======================================================================================*/  
  329. {  
  330. CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO));  
  331.   
  332.     HRESULT hr;  
  333.   
  334.     IDispatch *pDisp;  
  335.     pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口   
  336.   
  337.     IHTMLDocument2* pDoc;  
  338.     hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口   
  339.       
  340.     IHTMLElementCollection* pColl=NULL;  
  341.     hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合   
  342.   
  343.     IDispatch *pDisp2;  
  344.     VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口   
  345.     //V_VT(&index)=VT_I4;   
  346.     //V_I4(&index)=0;   
  347.     index.vt=VT_I4;  
  348.     index.lVal=0;  
  349.   
  350.     VARIANT varID;//要查找的HTML标记ID   
  351.     varID=StringToVariant(_T("userlike_info_head_img"));  
  352.   
  353.     hr=pColl->item(varID,index,&pDisp2); //找到元素的位置   
  354.     if(S_OK==hr&&NULL!=pDisp2)  
  355.     {  
  356.         IHTMLElement3* pElem=NULL;  
  357.         hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);  
  358.         IHTMLElementRender *pRender =  NULL;    
  359.         pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);    
  360.         pRender->DrawToDC(hImageDC);  
  361.     }  
  362. }  
  363. /*=================================================================================*/  
  364.   
  365. /*================================================================================= 
  366. 判断网页是否加在完全(包含框架) 
  367. 原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕! 
  368. =====================================================================================*/  
  369. void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)  
  370. {  
  371.     // TODO: 在此处添加消息处理程序代码   
  372.     CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb;   
  373.     CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2;   
  374.     pWeb   =   pDisp;   
  375.     pWeb-> get_Document((IDispatch**)&pDoc2);   
  376.     if   (m_webBrowser.get_Document()   ==   pDoc2)     
  377.     {  
  378.           ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));  
  379.     }  
  380.     /////////////////////////////////////////   
  381.     /*if(0==m_count) 
  382.     { 
  383.         ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!")); 
  384.         m_count++; 
  385.     }*/  
  386. }  
  387. /*=============================================================================*/  
  388. /*============================================================================== 
  389.  另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE 
  390. ==============================================================================*/  

你可能感兴趣的:(VC++ webbrowser函数使用范例)