• vc采集网页内frame框架下所有元素(不指定具体table/form) .


    1.独立代码

    //-----------开始---------------------//
    #include <atlbase.h>
    #include <mshtml.h>
    #include <winuser.h>
    #include <comdef.h>
    #include <string.h>
    void EnumIE(void);//处理网页
    CComModule _Module;  //使用CComDispatchDriver ATL的智能指针,此处必须声明
    #include <atlcom.h>
    void EnumAllElement(IHTMLDocument2 * pIHTMLDocument2);

    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:8082/csp/"; //设置过滤的网址
        //*******************************************************************************

        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的接口指针      
           EnumAllElement(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   接口
      
      EnumAllElement(spDoc2);      //递归枚举当前子框架   IHTMLDocument2   上的所有控件
     }  
    }

    void EnumAllElement(IHTMLDocument2 * pIHTMLDocument2) //枚举所有字段
    {
     if (!pIHTMLDocument2) return; 
     EnumFrame(pIHTMLDocument2);   //递归枚举当前IHTMLDocument2上的子框架frame  
     HRESULT   hr;  

     CComQIPtr<IHTMLElementCollection> spAllElement;
     hr=pIHTMLDocument2->get_all(&spAllElement);//获取所有网页内所有元素
     if (FAILED(hr))  return;  

     long nLength = 0;
     spAllElement->get_length (&nLength);
     for (int i = 0; i < nLength; i++)
     {
            CComPtr<IDispatch> pDisp;
      hr = spAllElement->item(COleVariant((long)i),COleVariant((long)0),&pDisp); //获取单个元素
      if(SUCCEEDED(hr))
      {
       //CComQIPtr <IHTMLElement, &IID_IHTMLElement> pElement(pDisp);
       CComQIPtr<IHTMLElement, &IID_IHTMLElement> pElement;
       pDisp->QueryInterface(&pElement);
       BSTR bTemp;
       pElement->get_id(&bTemp);//可以获取其他特征,根据具体元素而定
       CString strTemp=bTemp;
       if(!strTemp.IsEmpty() && strTemp=="callNo")//根据callNo(效能提升text控件id)是主叫号码获取值或作其他处理
       {
        IHTMLInputTextElement* input;
        pDisp->QueryInterface(IID_IHTMLInputTextElement,(void**)&input);
        input->get_value(&bTemp);
        if(bTemp==NULL) strTemp="null";
        else strTemp=bTemp;
        CStdioFile ioFile;
        ioFile.Open("callerno.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
        ioFile.SeekToEnd();//先定位到文件尾部
        CString strInsert=strTemp+"/n";
        ioFile.WriteString(strInsert);
        ioFile.Close();
       }
      }
     }
    }

    //-----------结束---------------------//

    2.执行代码:

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

    from:http://blog.csdn.net/fjssharpsword/article/details/6193564

  • 相关阅读:
    DOS命令下输入:java Hello 出现以下几种结果可能的原因:
    4.用文本编辑器输入课堂上练习的Hello.java,并在JDK环境下编译和运行。请将程序编译、运行的结果截图,填入下框中。
    继承(9.21)——————————课后练习
    ★Java面向对象(一)——————————基本概念
    Java常用设计模式《转》
    继承(9.20)——————————随堂演练
    ★Java语法(七)——————————循环语句
    重载(9.19)——————————随堂演练
    面向对象(9.18)——————————随堂演练
    ★Java语法(六)——————————分支语句
  • 原文地址:https://www.cnblogs.com/lidabo/p/2791460.html
Copyright © 2020-2023  润新知