这段代码有什么问题吗? 关于IHTMLLinkElement的。

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

这段代码有什么问题吗? 关于IHTMLLinkElement的。

楼主ttzzgg_80713(身无立锥地,常有四海心---老子有条命) 2002-09-15 22:52:34 在 VC/MFC / HTML/XML 提问

以下使用的是www.csdn.net/expert的网页.   
    
  void   CLeftView::GetAllRoom(IHTMLDocument2Ptr   pDoc)   
  {   
  USES_CONVERSION;   
  IDispatchPtr pDisp;   
  IHTMLElementCollectionPtr pItems;   
  _variant_t vIndex,   vDummy;   
  HRESULT hr;   
    
  long p(0);   
    
  pDoc->get_all(&pItems);   
  pItems->get_length(&p);   
  vIndex.vt   =   VT_I4;   
    
  try   
  {   
  hr   =   pDoc->get_all(&pItems);   
  if   (FAILED(hr))   
  return;   
  pItems->get_length(&p);   
  long   i(0);   
  for   (;   i   <   p;   ++i)   
  {   
  vIndex.lVal   =   i;   
  IDispatchPtr pDisp;   
    
  if   (SUCCEEDED(pItems->item(vIndex,   vDummy,   &pDisp)))   
  {   
  IHTMLLinkElementPtr pLink;   
  _bstr_t link;   
  if   (SUCCEEDED(pDisp->QueryInterface(&pLink)))   
  {   
  TRACE("Get   a   link   element/n");   //   只输出一次,不会只有一个吧???   
  if   (SUCCEEDED(pLink->get_href((BSTR*)&link)))   
  {   
  ;   
  }   
  }   
  }   
  }   
  }   
  catch   (_com_error   &e)   
  {   
  CString   error   =   W2T(e.Description());   
  TRACE("exception   :   %s/n",   error);   
  }   
  catch   (...)   
  {   
  TRACE("Get   Exception   :   unknow   excpetion/n");   
  }   
  //-------   
  //   Log   it   
  //-------   
  CFile file;   
  int _count(0);   
  file.Open("c://test.txt",   CFile::modeCreate   |   CFile::modeReadWrite);   
    
  for   (_count   =   0;   _count   <   m_strRoom.GetSize();   ++_count)   
  {   
  file.Write(m_strRoom[_count],   m_strRoom[_count].GetLength());   
  file.Write("/r/n",   4);   
  }   
  file.Close();   
  }   
    
    
 问题点数:120、回复次数:15Top

frameborder="0" scrolling="no" src="http://topic.csdn.net/Include/Board.htm?Tags=" style="width: 100%; height: 100%; overflow-x: hidden; overflow-y: hidden; ">

1 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-15 23:09:39 得分 0

为什么我的总是没有人回答,Top

2 楼xghome(东楼)回复于 2002-09-15 23:10:37 得分 0

gzTop

3 楼ccat(智拙)回复于 2002-09-15 23:28:21 得分 30

这个是用的IE的内核吗?我对VC不懂,见笑了。Top

4 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-15 23:30:43 得分 0

。原来兄台是位牛兄。失敬。。。失敬。Top

5 楼papaya_stone(^_^)shentong(^_^)回复于 2002-09-15 23:50:29 得分 0

你想要得到什么?网页上的所有链接吗?Top

6 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-16 00:06:54 得分 0

yeah.Top

7 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-16 00:20:33 得分 0

我头发都 快白了。Top

8 楼onestab()回复于 2002-09-16 00:31:39 得分 30

why   don't   you   use   IHTMLDocument2::get_anchors   Method   
  to   retrieve   an   interface   pointer   to   a   zero-based   collection   of   all   the   A   objects   in   an   HTML   document.Top

9 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-16 00:43:51 得分 0

let's   try.Top

10 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-16 01:11:44 得分 0

if   (SUCCEEDED(pDoc->get_anchors(&pItems)))   
  {   
          pItems->get_length(&p);   //   p   ==   0   ???   
          ....   
    
  }Top

11 楼onestab()回复于 2002-09-16 01:54:28 得分 0

I   neglect   the   Notes   from   MSDN:   
  The   collection   returns   only   anchor   objects   that   have   a     
  ***name   or   id   attribute   ***   value.   If   duplicate   names   are   found,   a   collection   of   those   named   items   is   returned.   Collections   of   duplicate   names   must   be   referenced   subsequently   by   ordinal   position.   
    
  it   seems   you   have   to   get   all   elements   and   examine   the   anchors   individualy.   
 Top

12 楼onestab()回复于 2002-09-16 01:55:39 得分 0

a   useful   link:   
  http://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_11654078.htmlTop

13 楼cker(〖烟波浩淼三千里、人鬼殊途五百年〗)回复于 2002-09-17 01:13:30 得分 30

if(pHTMLDocument)   
      {   
      IHTMLElementCollection   *pAnchors   =   NULL;   
      if(SUCCEEDED(pHTMLDocument->get_all(&pAnchors)))   
      {   
      long   ilHrefCount   =   0;   
      if(SUCCEEDED(pAnchors->get_length(&ilHrefCount)))   
      {   
                                                            long   ilHrefIndex   =   0;   
      for(;   ilHrefIndex   <   ilHrefCount;   ilHrefIndex++)   
      {   
      _variant_t   vIndex;   
      vIndex.vt   =   VT_I4;   
      vIndex.lVal   =   ilHrefIndex;   
    
      IDispatch   *pItem   =   NULL;   
      pAnchors->item(vIndex,   vIndex,   &pItem);   
      if(pItem   !=   NULL)   
      {   
      IHTMLAnchorElement   *pAnchor   =   NULL;   
      if(SUCCEEDED(pItem->QueryInterface(IID_IHTMLAnchorElement,   
      (LPVOID*)&pAnchor)))   
      {   
    
      _bstr_t bURL;   
      if(SUCCEEDED(pAnchor->get_href(&bURL)))   
                                                      {   
                                                          string   s   =     W2A(bURL);   
                                                          vector<string>::iterator   it   =   find(vstrings.begin(),vstrings.end(),s);   
    
                                                          if   (it   ==   vstrings.end()   &&   s.length()>0)   
                                                                  vstrings.push_back(s);   
    
                                                      }   
      pAnchor->Release();   
      }   
      pItem->Release();   
      }   
      }   
      }   
      pAnchors->Release();   
      }   
      }Top

14 楼congling(congling)回复于 2002-09-17 02:03:20 得分 30

一个使用JScript的方法,大可不必写VC的程序而且可以作为发布扩展和修改,虽然比较复杂,但是灵活掌握可以做到高扩展性,   
  文档中除了JSArrayToElementArray是从其他网站上,摘抄下来,其他都是我自己写的,其中JSObjectToAttributes花了我一天   
  的时间方试出来,这个函数我曾经花了200分在CSDN上询问,无奈无人知晓   
  我打算专门为JScript和VC的互通性写一套库   
    
    
  本文档仅能使用在VS7.0的版本   
    
  VC-JScript:   
    
  HRESULT   ExecuteScript(IHTMLWindow2*   spWin,BSTR   bstrScript,VARIANT   *pvarRet)   
  {   
  HRESULT   hr;   
  VARIANT   var;   
  VariantInit(&var);   
  if(FAILED(hr=spWin->execScript(CComBSTR("eval(/"/");"),CComBSTR("javascript"),&var)))   
  return   hr;   
  VariantClear(&var);   
    
  DISPID   dispid;   
  CComBSTR   bstrName("eval");   
  if(FAILED(hr=spWin->GetIDsOfNames(IID_NULL,   
  &bstrName,   
  1,   
  LOCALE_SYSTEM_DEFAULT,   
  &dispid)))   return   hr;   
    
    
  DISPPARAMS   params;   
  CComVariant   varRet;   
    
  memset(&params,0,sizeof(params));   
  params.cArgs=1;   
  params.rgvarg=&var;   
    
  var.vt=VT_BSTR;   
  var.bstrVal=bstrScript;   
  hr=spWin->Invoke(dispid,IID_NULL,0,DISPATCH_METHOD,&params,pvarRet,NULL,NULL);   
  return   hr;   
  }   
    
  HRESULT   ExecuteScript(IHTMLWindow2*   spWin,LPCTSTR   lpszScript,VARIANT   *pvarRet)   
  {   
  return   ExecuteScript(IHTMLWindow2*   spWin,CComBSTR(lpszScript),VARIANT   *pvarRet)   
  }   
    
    
  HRESULT   ExecuteScript(IHTMLDocument2*   spDoc,BSTR   bstrScript,VARIANT   *pvarRet)   
  {   
  HRESULT   hr;   
  CComPtr<IHTMLWindow2>   spWin;   
  if(FAILED(hr=spDoc->get_parentWindow(&spWin)))   
  return   hr;   
  return   ExecuteScript(spWin,bstrScript,pvarRet);   
  }   
    
  HRESULT   ExecuteScript(IHTMLDocument2*   spDoc,LPCTSTR   lpszScript,VARIANT   *pvarRet)   
  {   
  return   ExecuteScript(spDoc,CComBSTR(lpszScript),pvarRet);   
  }   
    
    
  typedef   CSimpleMap<CComBSTR,CComVariant>   MapAttr;   
  HRESULT   JSObjectToAttributes(IDispatch*   pDisp,MapAttr&   map)   
  //这个函数可以解释动态生成的JSObject的属性   
  {   
  CComPtr<ITypeInfo>   spInfo;   
  HRESULT   hr;   
  hr=pDisp->GetTypeInfo(0,LOCALE_SYSTEM_DEFAULT,&spInfo);   
  if(hr!=S_OK)return   hr;   
  TYPEATTR*   pTypeAttr;   
  hr=spInfo->GetTypeAttr(&pTypeAttr);   
  if(hr!=S_OK)   return   hr;   
    
  WORD   cVars=pTypeAttr->cVars;   
  spInfo->ReleaseTypeAttr(pTypeAttr);   
  for(WORD   i=0;i<cVars;i++)   
  {   
  VARDESC*   pVarDesc;   
  if(spInfo->GetVarDesc(i,&pVarDesc)==S_OK)   
  {   
  MEMBERID   memid=pVarDesc->memid;   
  spInfo->ReleaseVarDesc(pVarDesc);   
  UINT   count;   
  CComBSTR   bstrName;   
  if(spInfo->GetNames(memid,&bstrName,1,&count)==S_OK)   
  {   
  CComVariant   var;   
  DISPPARAMS   param;   
  memset(&param,0,sizeof(param));   
  hr=pDisp->Invoke(memid,   
  IID_NULL,   
  LOCALE_SYSTEM_DEFAULT,   
  DISPATCH_PROPERTYGET,   
  &param,   
  &var,   
  NULL,   
  NULL);   
  if(SUCCEEDED(hr))   
  map.Add(bstrName,var);   
  }   
  }   
  }   
  return   S_OK;   
  }   
    
    
  HRESULT   JSArrayToArray(IDispatch*   pDisp,CSimpleArray<CComVariant>&   arr)   
  //这个函数获取JSArray元素的函数,其实也可以从JSObjectToAttributes获得   
  {   
  HRESULT   hr;   
  DISPPARAMS   dispArgs=   {   NULL,   NULL,   0,   0   };   
  CComVariant   var;   
  hr   =   pDisp->Invoke(   DISPID_NEWENUM,   
  IID_NULL,   
  LOCALE_SYSTEM_DEFAULT,   
  DISPATCH_PROPERTYGET,   
  &dispArgs,   
  &var,   
  NULL,   
  NULL   );   
  if(   FAILED(   hr   ))   
  return   NULL;   
    
  if   (var.vt   !=   VT_UNKNOWN   &&   var.vt   !=   VT_DISPATCH)   
  return   NULL;   
    
  CComQIPtr<IEnumVARIANT>   pEnum(   var.punkVal   );   
  if(   !pEnum   )   
  return   NULL;   
    
  hr   =   S_OK;   
  while(   hr   ==   S_OK   )   
  {   
  CComVariant   elemV;   
  hr   =   pEnum->Next(   1,   &elemV,   NULL   );   
  if(   elemV.vt   !=   VT_EMPTY   )//   correct   for   dispproxy   bug   19307   
  arr.Add(elemV);   
  else   
  hr=S_FALSE;   
  }   
          return   S_OK;   
  }   
    
    
  针对你的问题   
    
  Javascript文件内容:   
    
  var   hrefArray=new   Array();   
  var   col=document.all.tags("A");   
  for(var   i=0;i<col.length;i++)   
        hrefArray[hrefArray.length]=col[i].href;   
  hrefArray   
    
    
  VC内容:   
    
  void   CLeftView::GetAllRoom(IHTMLDocument2Ptr   pDoc)   
  {   
  BSTR   bstrScript=GetAllRoomScript();   
  CComVariant   varJSArray;   
  if(SUCCEEDED(ExecuteScript(pDoc,bstrScript,&varJSArray))   &&   varJSArray.vt==VT_DISPATCH)   
  {   
  CSimpleArray<CComVariant>   arrHref;   
  if(SUCCEEDED(JSArrayToArray(varJSArray.pdispVal,arrHref)))   
  {   
  //do   what   ever   you   want   
  }   
  }   
  }

CppWebBrowser的使用一 自动点击网页上的超级链接 C Builder 5.0以后 CppWebBrowser组件代替了原来的HTML组件 实际上 这个组件封装了Windows的Shell Doc Object和控制库(SHDOCVW.DLL) 中的IWebBrowser2接口 这个接口可以用来创建一个定制的Web浏览器应用程序 所以CppWebBrowser 组件几乎包含了一个Web 浏览器所具有的全部功能 它本身就是一个功能比较强大的浏览器 阅读详情

相关推荐

html元素的linkElement方法,selenium---八种定位元素方法

自动化最基础的就属于定位元素了,元素不会定位,基本上已经团灭了,就不用再去考虑什么自动化了。css八大定位方法selenium定位元素基本上和appium的定位元素方法相同,这里基于百度网站进行测试appid定位经过了解HTML能够知道id是惟一表示,经过查找id的方法进行查找测试find_element_by_id() name定位name在HTML中一般指元素的名称网站find_element...

weixin_35725654的博客 392

js的function获取input值为 [object htmlinputelement]?

解决方案在最后 实现功能:单击发送注册码按钮,异步将输入的邮箱发送到后台,实现邮箱认证功能 问题描述:在script中使用ajax向后台传递输入的邮箱时,发现js中通过id获取的是 [object htmlinputelement] html in register.jsp &lt;!--==========================邮箱===================...

方块♦的博客 4万+

过一遍html标签(一)

根元素html html元素代表HTML文档的根,其他所有元素都是此元素的后代。因为html元素是一个文档中的第一个元素(除了注释),因此它被叫做根元素。 在HTML中它不是必须的,但在XHTML中必须明确给出html元素的开闭标签。 对应的DOM接口是HTMLHtmlElement。 文档元数据head HTML Head 元素规定文档相关的通用信息(元数据),包括文档标题、样式或脚本。父

(づ。◕‿‿◕。)づgigi奋斗在前端和刷题中╮(╯﹏╰)╭ 1084

alter tablespace/database语句中的reuse选项

alter tablespace temp add  tempflie   size 100m reuse:

haiross的专栏 4401

28.3.1 创建数据库

28.3.1  创建数据库通过Oracle所提供的数据库配置向导创建数据库是一种比较方便的创建数据库方式,用户只需要使用鼠标选择需要的选项并单击【下一步】按钮即可完成数据库的创建工作。具体步骤如下所示。(1)在终端窗口中以oracle用户的身份执行dbca命令,打开如图28.23所示的【欢迎使用】对话框。 图28.23  数据库配置向导欢迎界面(2)单击【下一步】按钮,进入

Linux/UNIX典藏大系 1019

Vue中出现Can‘t find element错误的解决方法

最近刚自学了Vue,想动手试一试 项目结构如下 test.Vue和vue.config.js是自己添加的文件,其余都是新建项目时就有的。 test.Vue一开始如下: <template> <div id="example"> <p>Original message: "{{ message }}"</p> </div> </template> <script> import Vue from

qq_38024443的博客 6248

解决vue中post请求传递对象参数变成[object%20Object]的问题

1.问题描述 前后端分离项目中,前端vue项目的一个post请求接口传递json对象参数时,传递变成[object%20Object]形式,且接口调用出错: 2.问题解决 经过一番挣扎之后,终于解决了问题。一开始压根没有注意到接口调用传参格式问题,犯这种低级错误实在是不应该。 修改前: 修改后: 3.传参规范 get请求传参: post请求传参: 4.修改之后成功调用 ...

爱吃鸡腿的明仔 2万+

初学vue 在做项目时遇到的问题与解决办法(使用element组件)(二)

表格每行里都有按钮 <el-table-column prop="option" label="操作" align="center" > <template slot-scope="scope"> <el-button size="mini" plain @click="del(scope.$index,scop...

weixin_30655219的博客 278

JavaScript 习题及面试题 3

365. [问答题] 原生 JavaScript 中兼容浏览器绑定元素事件 ---------------------------------------------------------------------------------------------------------------------------- 来自:原生 Javascript 编程练习题参考: function addEventSamp(obj,evt,fn){ if (obj.addEventListe..

qq_34227896的博客 1万+

Element-Ui组件(四)Link 文字链接

Element-Ui组件(四)Link 文字链接 本文参考Element官方文档: http://element-cn.eleme.io/#/zh-CN/component 基础用法 el-link比较简单,用法与el-button类似,经常与icon搭配使用,type属性主要用于控制其颜色,以下是用一组链接制作的简单导航栏: <template> <div> ...

究极死胖兽的博客 4万+

js循环页面元素判断

function aa(){var str="";for (i=0;i{if(document.all.tags("input")[i].type == "checkbox"){if(document.all.tags("input")[i].checked){str=str+ (document.all.tags("input")[i].name)+";";}} }alert (str+"被选择

2296
上一篇: 由于应用程序配置不正确,程序未能启动”--原因及解决方法
下一篇: select top 的用法
skyremember
博客等级 码龄20年 203粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值