这段代码有什么问题吗? 关于IHTMLLinkElement的。
2008-12-17 00:38
344 查看
这段代码有什么问题吗? 关于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
1 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-15 23:09:39 得分 0
为什么我的总是没有人回答,Top2 楼xghome(东楼)回复于 2002-09-15 23:10:37 得分 0
gzTop3 楼ccat(智拙)回复于 2002-09-15 23:28:21 得分 30
这个是用的IE的内核吗?我对VC不懂,见笑了。Top4 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-15 23:30:43 得分 0
。原来兄台是位牛兄。失敬。。。失敬。Top5 楼papaya_stone(^_^)shentong(^_^)回复于 2002-09-15 23:50:29 得分 0
你想要得到什么?网页上的所有链接吗?Top6 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-16 00:06:54 得分 0
yeah.Top7 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2002-09-16 00:20:33 得分 0
我头发都 快白了。Top8 楼onestab()回复于 2002-09-16 00:31:39 得分 30
why don't you use IHTMLDocument2::get_anchors Methodto 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.Top10 楼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.html href="http://topic.csdn.net/t/20020915/22/1026052.html#" target=_blank>Top
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(¶ms,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,¶ms,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(¶m,0,sizeof(param));
hr=pDisp->Invoke(memid,
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET,
¶m,
&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
}
}
}
相关文章推荐
- 关于eclipse修改代码重启问题解决方案
- 关于Asp.net中使用以下代码导出Excel表格的问题
- 关于"Windows不能在本地计算机启动Apache2.......并参考特定服务错误代码1"问题解决
- 关于使用 iOS 中Instrument只显示地址不显示具体代码的问题
- 欢迎争讨继承的问题,下面三段代码分别输出什么?欢迎留言
- 关于PullToRefreshLayout和PullToRefreshScrollView同时使用代码报错的问题
- 关于IntelliJ IDEA 无法编辑代码的问题
- 关于HTML 代码注入,XSS攻击问题解决
- 关于eclipse安装的Extjs4.2没代码提示的问题
- 关于使用FMDB往数据库里插入空字符串@""后,再读出来是什么东西的问题
- RXSwift 关于使用textFiled的时候onCompleted 什么时间执行的问题
- 关于修改web app项目java代码后Eclipse没有重新编译的问题
- git远程库代码版本回滚方法问题 关于远程代码回滚
- 关于Mac下编译ffmpeg静态库供framework或者dylib调用出现illegal text-relocoation代码重定向问题
- ie的大问题,关于document。getElementById和getElementsByName
- 关于ISP下载中 编译后自动下载代码不能执行完成的一点问题
- 解决关于win10下eclipse代码格式化不生效问题
- 关于QT5下代码中文字符编译不通过的问题
- 关于vs2013中的BrowserLink问题
- 关于Unity代码控制音频播放的问题