zoukankan      html  css  js  c++  java
  • vc遍历网页表单并自动填写提交 .

    1.独立代码

    //-----------开始---------------------//
    #include <atlbase.h>
    #include <Mshtml.h>
    #include <winuser.h>
    #include <comdef.h>
    #include <string.h>
    void EnumIE(void);//处理网页
    void EnumFrame(IHTMLDocument2 * pIHTMLDocument2);//处理框架
    void EnumForm(IHTMLDocument2 * pIHTMLDocument2);//处理表单
    CComModule _Module;  //使用CComDispatchDriver ATL的智能指针,此处必须声明
    #include <atlcom.h>
    void EnumField(CComDispatchDriver spInputElement,CString ComType,CString ComVal,CString ComName);//处理表单域

    void EnumIE(void)  
    {  
      CComPtr<IShellWindows> spShellWin;  
      HRESULT hr=spShellWin.CoCreateInstance(CLSID_ShellWindows);  
      if (FAILED(hr))  
      {  
      return;  
      }      

      long nCount=0;    //取得浏览器实例个数(Explorer和IExplorer)  
      spShellWin->get_Count(&nCount);  
      if (0==nCount)  
      {  
        return;  
      }

      for(int i=0; i<nCount; i++)  
      {  
        CComPtr<IDispatch> spDispIE;  
        hr=spShellWin->Item(CComVariant((long)i), &spDispIE);  
        if (FAILED(hr)) continue;
     
        CComQIPtr<IWebBrowser2>spBrowser=spDispIE;  
        if (!spBrowser) continue;
     
        CComPtr<IDispatch> spDispDoc;  
        hr=spBrowser->get_Document(&spDispDoc);  
        if (FAILED(hr)) continue;
     
        CComQIPtr<IHTMLDocument2>spDocument2 =spDispDoc;  
        if (!spDocument2) continue;      

     //Modify by jncao 2007-09-17
     //*******************************************************************************
     CString cIEUrl_Filter;  //设置的URL(必须是此URL的网站才有效);
        cIEUrl_Filter="http://127.0.0.1/SmtCCS_manage/"; //设置过滤的网址
        //*******************************************************************************

        CComBSTR IEUrl;
     spBrowser->get_LocationURL(&IEUrl);   
     CString cIEUrl_Get;     //从机器上取得的HTTP的完整的URL;
     cIEUrl_Get=IEUrl;
     cIEUrl_Get=cIEUrl_Get.Left(cIEUrl_Filter.GetLength()); //截取前面N位

     if (strcmp(cIEUrl_Get,cIEUrl_Filter)==0)
     {
         // 程序运行到此,已经找到了IHTMLDocument2的接口指针      
            EnumForm(spDocument2); //枚举所有的表单        
     }   
       
      }  
    }

    void EnumFrame(IHTMLDocument2 * pIHTMLDocument2)
    {  
     if (!pIHTMLDocument2) return;      
     HRESULT   hr;  
       
     CComPtr<IHTMLFramesCollection2> spFramesCollection2;  
     pIHTMLDocument2->get_frames(&spFramesCollection2); //取得框架frame的集合  
       
     long nFrameCount=0;        //取得子框架个数  
     hr=spFramesCollection2->get_length(&nFrameCount);  
     if (FAILED(hr)|| 0==nFrameCount) return;  
       
     for(long i=0; i<nFrameCount; i++)  
     {  
      CComVariant vDispWin2; //取得子框架的自动化接口  
      hr = spFramesCollection2->item(&CComVariant(i), &vDispWin2);  
      if (FAILED(hr)) continue;      
      CComQIPtr<IHTMLWindow2>spWin2 = vDispWin2.pdispVal;  
      if (!spWin2) continue; //取得子框架的   IHTMLWindow2   接口      
      CComPtr <IHTMLDocument2> spDoc2;  
      spWin2->get_document(&spDoc2); //取得子框架的   IHTMLDocument2   接口
      
      EnumForm(spDoc2);      //递归枚举当前子框架   IHTMLDocument2   上的表单form  
     }  
    }

    void EnumForm(IHTMLDocument2 * pIHTMLDocument2)  
    {  
      if (!pIHTMLDocument2) return;
     
      EnumFrame(pIHTMLDocument2);   //递归枚举当前IHTMLDocument2上的子框架frame  

      HRESULT hr;
         
      USES_CONVERSION;      

      CComQIPtr<IHTMLElementCollection> spElementCollection;  
      hr=pIHTMLDocument2->get_forms(&spElementCollection); //取得表单集合  
      if (FAILED(hr))  
      {  
        return;  
      }  
       
      long nFormCount=0;           //取得表单数目  
      hr=spElementCollection->get_length(&nFormCount);  
      if (FAILED(hr))  
      {  
        return;  
      }  
       
      for(long i=0; i<nFormCount; i++)  
      {  
        IDispatch *pDisp = NULL;   //取得第i项表单  
        hr=spElementCollection->item(CComVariant(i),CComVariant(),&pDisp);  
        if (FAILED(hr)) continue;  
       
        CComQIPtr<IHTMLFormElement> spFormElement= pDisp;  
        pDisp->Release();  
       
        long nElemCount=0;         //取得表单中域的数目  
        hr=spFormElement->get_length(&nElemCount);  
        if (FAILED(hr)) continue;  
       
        for(long j=0; j<nElemCount; j++)  
     {  
        
          CComDispatchDriver spInputElement; //取得第j项表单域  
          hr=spFormElement->item(CComVariant(j), CComVariant(), &spInputElement);  
          if (FAILED(hr)) continue;  

          CComVariant vName,vVal,vType;     //取得表单域的名称,数值,类型
          hr=spInputElement.GetPropertyByName(L"name", &vName);  
          if (FAILED(hr)) continue;  
          hr=spInputElement.GetPropertyByName(L"value", &vVal);  
          if(FAILED(hr)) continue;  
          hr=spInputElement.GetPropertyByName(L"type", &vType);  
          if(FAILED(hr)) continue;  
       
          LPCTSTR lpName= vName.bstrVal ? OLE2CT(vName.bstrVal) : _T("NULL"); //未知域名  
          LPCTSTR lpVal=  vVal.bstrVal  ? OLE2CT(vVal.bstrVal)  : _T("NULL"); //空值,未输入  
          LPCTSTR lpType= vType.bstrVal ? OLE2CT(vType.bstrVal) : _T("NULL"); //未知类型 
      
       EnumField(spInputElement,lpType,lpVal,lpName);//传递并处理表单域的类型、值、名
     }//表单域循环结束    
      }//表单循环结束      
    }  

    void EnumField(CComDispatchDriver spInputElement,CString ComType,CString ComVal,CString ComName)
    {//处理表单域
     if ((ComType.Find("text")>=0) && strcmp(ComVal,"NULL")==0 && strcmp(ComName,"userName")==0)
       {
         CString Tmp="123456";
         CComVariant vSetStatus(Tmp);
      spInputElement.PutPropertyByName(L"value",&vSetStatus);
       }
       if ((ComType.Find("password")>=0) && strcmp(ComVal,"NULL")==0 && strcmp(ComName,"password")==0)
       {
         CString Tmp="123456";
         CComVariant vSetStatus(Tmp);
      spInputElement.PutPropertyByName(L"value",&vSetStatus);
       }
       if ((ComType.Find("submit")>=0))
       {
      IHTMLElement*  pHElement;
      spInputElement->QueryInterface(IID_IHTMLElement,(void **)&pHElement);
      pHElement->click();               
       }
    }
    //--------------------结束--------------------------------------// 

    2.执行:

    void CDemoDlg::OnOK()
    {
     // TODO: Add extra validation here
      ::CoInitialize(NULL); //初始化COM
         EnumIE();             //枚举浏览器      
         ::CoUninitialize();   //释放COM
     //CDialog::OnOK();
    }

  • 相关阅读:
    django1.6 django-dajaxice的安装配置.
    jquery js ajax 不错的想法
    django1.6 GET url传参 乱码
    django1.6 CSRF verification failed. Request aborted. 用出现表单提交
    Caml语句中筛选lookup字段
    sharepoint Jsom一些基本操作
    JSOM启动工作流
    数据量太大时,如何实现分页查询-CSOM
    数据量太大时,如何实现分页查询-JSOM
    JS加强学习-DOM学习02
  • 原文地址:https://www.cnblogs.com/lidabo/p/2791462.html
Copyright © 2011-2022 走看看