唉,为了这个小问题搞了两个星期,郁闷到了极点。
一个html网页,已经显示了一些内容。网页上已经用javascript写好了网页元素的各种响应函数。现在我需要根据内容的不同小范围的修改网页,利用IHTMLDocument2接口 vc可以很容易的添加各种网页元素并设置它们的值。但是在设置它们的响应函数时碰到困难了。
以设置Onclick为例,HRESULT IHTMLElement::put_onclick(VARIANT v)和HRESULT attachEvent( BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult)都可以设置响应函数。但必须找到响应函数的IDispatch 。
msdn上有
HRESULT IHTMLDocument::get_Script(IDispatch **p);
可以获得script的IDispatch,再往下就只能用IDispatch的Invoke()来执行script中的函数。达不到目的。网上找了些相关的例子,都是采用的方法子类化IDispatch的方法。如下:
pClickEvent = new CClickEvent ; //CClickEvent是自己实现的IDispatch子类
VARIANT vDocDisp;
vDocDisp.vt = VT_DISPATCH;
vDocDisp.pdispVal = pClickEvent ;
pDoc2->put_onclick( vDocDisp);
将自己写的响应函数体写入重载Invoke()函数就行了。
但这种方法的函数体实现是在vc中实现的,也与目标不符。
无数次的查看msdn,突然发现put_onclick的反面不是get_onclick么。
于是我在网页的开头添加了一个hidden元素
<input type=hidden id="substr" name="hiddenObject" value="" onclick="clickhand()">
想到了吧,获取了hidden元素onclick响应函数不就是得到了其它网页元素的onclick响应函数了吗。下面是我的代码:
if (m_pBrowser->get_Document( &spDispatch) != S_OK)
return;
spDispatch->QueryInterface(IID_IHTMLDocument3,(void**)&pDoc3);
VARIANT vOnclick;
BSTR bstrid = ::SysAllocString(L"substr");
pDoc3->getElementById(bstrid,&pElement);
pElement->get_onclick(&vOnclick);
这样就获取了onclick的响应函数。
之后就简单啦,假设添加的网页元素是pAddElement,设置它的onclick响应函数只需 pAddElement->put_onclick(vOnclick);
不管怎样总算可以交差啦。显然这种方法很无奈,我将它写下来,希望各位路过的人能有更好的办法。
联系客服