笨鸟再问:已经用IHTMLElementCollection得到元素集合,怎么得到具体的IHTMLElement

sxbyl 2000-12-29 10:27:00
我用CWebBrowser2先得到了IHTMLDocument2指针,然后用get_all得到了所有元素的集合,如何才能得到一个指定元素的IHTMLElement指针?我用item(元素name,COleVariant((long)0),(IDispatch **)&objElement);得到的objElement是空指针,返回值为0
...全文
2556 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxbyl 2001-01-02
  • 打赏
  • 举报
回复
多谢Python 和 edyang两位高手指点,现在这个贴子中的问题已经得到解决,给分喽!
sxbyl 2001-01-02
  • 打赏
  • 举报
回复
To:Python 多谢您的程序,现在我正在看关于CComQIPtr的资料,有问题再请教!
sxbyl 2001-01-02
  • 打赏
  • 举报
回复
To:Python 多谢您的程序,现在我正在看关于CComQIPtr的资料,有问题在请教!
sxbyl 2001-01-02
  • 打赏
  • 举报
回复
To:edyang 呵呵……不好意思,关于第一个参数说明的第一句话没仔细看
Python 2001-01-02
  • 打赏
  • 举报
回复
hope can help u

void CTest1Dlg::GetElement()
{
HRESULT hr;
CComPtr<IDispatch>pDocDispatch = m_wndBrowser.GetDocument();

if(pDocDispatch.p != NULL)
{
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2>pHTMLDocument2(pDocDispatch);

if(pHTMLDocument2.p != NULL)
{
CComPtr<IHTMLElementCollection>pAnchorElements;

//HRESULT hr = pHTMLDocument2->get_all(&pAnchorElements);
HRESULT hr = pHTMLDocument2->get_anchors(&pAnchorElements);

if(SUCCEEDED(hr))
{
long nNumElements;
hr = pAnchorElements->get_length(&nNumElements);

if(SUCCEEDED(hr) && nNumElements)
{
for(long i = 0; i < nNumElements; i++)
{
CComVariant varName(i);
varName.ChangeType(VT_UINT);
CComVariant varIndex;
CComPtr<IDispatch>pDisp;

hr = pAnchorElements->item(varName, varIndex, &pDisp);
if(SUCCEEDED(hr))
{
//CComQIPtr<IHTMLElement, &IID_IHTMLElement>pElement(pDisp);
CComQIPtr<IHTMLAnchorElement, &IID_IHTMLAnchorElement>pElement(pDisp);

if(pElement.p != NULL)
{
CComBSTR bstrHref;

hr = pElement->get_href(&bstrHref);

//pElement->get_tagName(&bstrHref);
}// if(pElement.p != NULL)
}// if(SUCCEEDED(hr))
}// for(long i = 0; i < nNumElements; i++)
}// if(SUCCEEDED(hr) && nNumElements)
}// if(SUCCEEDED(hr))
}// if(pHTMLDocument2.p != NULL)
}// if(pDocDispatch.p != NULL)
}
Edward 2001-01-02
  • 打赏
  • 举报
回复
你没看完全 MSDN 的解释,再仔细的读一遍你就会明白了:
当第一个参数是字符串时,第二个参数用来取得到的 Collection 的指定位置的 IHTMLElement;第一个参数是数字时,第二个参数无用。第三个参数是接受 collection OR object 的 IDispatch 地址。
sxbyl 2001-01-02
  • 打赏
  • 举报
回复
多谢几位的回答,现在我用VB已经可以解决这个问题了,但我想搞清楚在VC种到底怎么解决这个问题,现在我把关键的操作贴出来大家帮忙看一下:
void CSendMsgDlg::OnDownloadCompleteExplorer()
{
// TODO: Add your control notification handler code here
IHTMLElementCollection *objAllElement=NULL;
IHTMLDocument2 *objDocument=NULL;
IHTMLElement *objElement=NULL;
CString strUrl;
BSTR bstrTemp;
strUrl=m_ctrlWeb.GetLocationURL();
if(strUrl.IsEmpty())
return;
objDocument=(IHTMLDocument2 *)m_ctrlWeb.GetDocument();
objDocument->get_all(&objAllElement);
objAllElement->item(COleVariant((long)0),COleVariant((long)0),(IDispatch **)&objElement);//*****
objElement->get_outerHTML(&bstrTemp); //这一不执行错误,就是那个0xc0000005错误
AfxMessageBox(CString(bstrTemp));
}

把*****那行改成objAllElement->item(COleVariant("sid"),COleVariant((long)0),(IDispatch **)&objElement);后还是不行,而且我以我所有的专家分保证:网页种绝对有sid这个东西!
sxbyl 2001-01-02
  • 打赏
  • 举报
回复
请Python去http://www.csdn.net/expert/TopicView.asp?id=54109留个言
mutant 2001-01-02
  • 打赏
  • 举报
回复
呵呵,来晚了,其实我是用的IDispatch.QueryInterface来实现的
sxbyl 2000-12-29
  • 打赏
  • 举报
回复
我又试了一下,
BSTR strID;
IHTMLElementCollection *objID=NULL;
HRESULT hr=objAllElement->item(COleVariant("sid"),COleVariant((long)0),(IDispatch **)&objID);返回后,objID不为空,
但执行objID->get_length(&lCount);执行非法操作,说调用了不合适的参数,
若定义objID为IHTMLElement类型,执行objID->get_className(&strID);报同样的错误
提示说这通常是因为强制转换函数指针的原因
请大家帮我分析一下
sxbyl 2000-12-29
  • 打赏
  • 举报
回复
我试了一下,可以的
元素:<input type="text" value="" name="sid" class="textface" maxlength="15">
document.all.sid.value="1234";运行正常
xubin_sh 2000-12-29
  • 打赏
  • 举报
回复
你先用javascript在页面中用document.all取一下看看
sxbyl 2000-12-29
  • 打赏
  • 举报
回复
To:edyang 但是我看MSDN的IHTMLElementCollection::item最后有如下一句对第三个参数有如下描述:Address of the IDispatch interface of the collection or object. 所以我认为是不是也有可能会返回一个集合?
另外,我的strID是BSTR型的。
Edward 2000-12-29
  • 打赏
  • 举报
回复

HRESULT hr=objAllElement->item(COleVariant("sid"),COleVariant((long)0),(IDispatch **)&objID);
得到的是 IHTMLElement,MSDN 上有解释;所以 objID->get_length(&lCount); 是不对的。不知道 objID->get_className(&strID); 为什么不行,strID 必须是 BSTR。
sxbyl 2000-12-29
  • 打赏
  • 举报
回复
类似的例子我在MSDN上也看到了,但是VC里怎么办呢?:(((
谁~~~能~~~告~~~诉~~~我~~~啊!
Un1 2000-12-29
  • 打赏
  • 举报
回复
终于发现一个VB的好处:

Private Sub Command1_Click()

Dim v As Variant
For Each v In WebBrowser1.Document.All
Debug.Print v.innerText
Next

End Sub

Private Sub Form_Load()
WebBrowser1.Navigate "www.21cn.com"
End Sub
sxbyl 2000-12-29
  • 打赏
  • 举报
回复
终于有人肯关心我的问题了,这是一个伟大的进步!!
可能是我没有描述清楚
现在有一个网页,我想在程序中对网页进行操作,比如添写表单什么的。我用的是CWebVrowser2,由它得到了IHTMLDocument2指针,再然后就如题了,哪里没说清楚我会再作解释。
silver 2000-12-29
  • 打赏
  • 举报
回复
不太懂啊 :(
silver 2000-12-29
  • 打赏
  • 举报
回复
不太懂啊 :(
sxbyl 2000-12-29
  • 打赏
  • 举报
回复
拜托就各位来看看吧:(

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧