zoukankan      html  css  js  c++  java
  • VC++ webbrowser函数使用范例

    /*============================说明部分================================= 
     实现一下函数需包含头文件 
    #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 
    ==============================================================================*/  


  • 相关阅读:
    16-1-6 kafka的操作
    16-1-5:MapReduce
    MapReduce概述
    MapReduce的代码实现过程分析
    MapReduce
    HDFS2—SequenceFile(小文件的解决方案)
    HDFS2—federation
    hdfs
    缓解爬虫ip被封的概率
    zookeeper集群搭建
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318399.html
Copyright © 2011-2022 走看看