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