我想在程序中 自动 产生一个事件。如下代码:
// ppDoc2 and ppElem2 已得到
// HTML代码部分如下
// <a href="" onmousedown="alert('test');"> test </a>
MSHTML::IHTMLDocument2Ptr ppDoc2;
MSHTML::IHTMLElement2Ptr ppElem2; MSHTML::IHTMLElement3Ptr ppElem3;
MSHTML::IHTMLDocument4Ptr ppDoc4;
MSHTML::IHTMLEventObj2Ptr ppEo2;
ppElem3 = ppElem2;
ppDoc4 = ppDoc2;
ppEo2 = ppDoc4->CreateEventObject( );
vEventObj.vt = VT_DISPATCH;
vEventObj.pdispVal = ppEo; VARIANT_BOOL ret = ppElem3->FireEvent(L"onmousedown", &vEventObj); ret 一直返回-1 而且也没触发alert('test');这个函数。 我在网上找了些答案。有说
1:是mshtml.h 与 mshtml.idl的问题。我也将vs2005下的这两个文件COPY到项目文件下。
2: _WIN32_IE问题 我已按如下定义:
#undef _WIN32_IE
#define _WIN32_IE 0x0600 可是还是没能解决问题。望jiangsheng(蒋晟)兄台能给与解答。
// ppDoc2 and ppElem2 已得到
// HTML代码部分如下
// <a href="" onmousedown="alert('test');"> test </a>
MSHTML::IHTMLDocument2Ptr ppDoc2;
MSHTML::IHTMLElement2Ptr ppElem2; MSHTML::IHTMLElement3Ptr ppElem3;
MSHTML::IHTMLDocument4Ptr ppDoc4;
MSHTML::IHTMLEventObj2Ptr ppEo2;
ppElem3 = ppElem2;
ppDoc4 = ppDoc2;
ppEo2 = ppDoc4->CreateEventObject( );
vEventObj.vt = VT_DISPATCH;
vEventObj.pdispVal = ppEo; VARIANT_BOOL ret = ppElem3->FireEvent(L"onmousedown", &vEventObj); ret 一直返回-1 而且也没触发alert('test');这个函数。 我在网上找了些答案。有说
1:是mshtml.h 与 mshtml.idl的问题。我也将vs2005下的这两个文件COPY到项目文件下。
2: _WIN32_IE问题 我已按如下定义:
#undef _WIN32_IE
#define _WIN32_IE 0x0600 可是还是没能解决问题。望jiangsheng(蒋晟)兄台能给与解答。
解决方案 »
- 怎么判断任务栏停靠到桌面的哪一边?
- 基于对话框:类视图中不能显示出CPcDlg类
- (activex/com组件) 和 (动态连接库) 有什么区别
- VS2005中怎么指定运行时dll所在的目录?
- 为什么_RecordsetPtr的Refresh()这么慢?(ADO问题)
- 关于CFontDialog初始化的时候字号的问题 我这里不知道怎么做了 保存的字号用在下次初始化的时候就不对了
- 我的程序,试用用:)
- 初学者请教:如何在一个类中引用另一个类中的变量
- 如何在属性面的标签上插入图标?
- 新手请教
- Visual.Studio.2005编译出来的VC程序需要net运行库吗?
- CSocket::Receive()收到一半就没了?
以前很少用在线更新。
为了解决问题。我让其自动升级为IE7
mshtml.tlb 现在版本是7.0但问题还是没有解决。
(附D的问题是。我被标记为盗版用户了。呵呵!)
IHTMLEventObj2Ptr vEventObj2 = ppDoc4->createEventObj(NULL);
vEventObj2->type = "mousedown";
vEventObj2->srcElement = ppElem3;
ppElem3->fireEvent(...)
VARIANT vEventObj;
IDispatchPtr spEvent;
BSTR bstrType;ppEo2 = ppDoc4->CreateEventObject( );
bstrType = SysAllocString( L"onmousedown" );
ppEo2->put_type( bstrType );
ppEo2->putref_toElement( ppElem2 );
spEvent = ppEo2;
vEventObj.vt = VT_DISPATCH;
vEventObj.pdispVal = spEvent; // ppEo2
VARIANT_BOOL ret = ppElem3->FireEvent(bstrType, &vEventObj);这样试也是不行.通过兄的指定.我发现了两点.
1: type 应为 mousedown. 不是onmousedown
2: putref_toElement 改为 putref_srcElement改过之后:VARIANT vEventObj;
IDispatchPtr spEvent;
BSTR bstrType;ppEo2 = ppDoc4->CreateEventObject( );
//bstrType = SysAllocString( L"onmousedown" );
bstrType = SysAllocString( L"mousedown" );
ppEo2->put_type( bstrType );
//ppEo2->putref_toElement( ppElem2 );
ppEo2->putref_srcElement( ppElem );
spEvent = ppEo2;
vEventObj.vt = VT_DISPATCH;
vEventObj.pdispVal = spEvent; // ppEo2
VARIANT_BOOL ret = ppElem3->FireEvent(bstrType, &vEventObj);此次运行到FireEvent时出现这个错误
---------------------------
Microsoft Visual C++
---------------------------
Unhandled exception in MSHTML.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.
---------------------------
确定
---------------------------
VARIANT_BOOL ret = ppElem3->FireEvent(bstrType, &vEventObj);
改为
VARIANT_BOOL ret = ppDoc4->FireEvent(bstrType, &vEventObj);也是同样出错
MSHTML::IHTMLElement3Ptr ppElem3;
MSHTML::IHTMLDocument4Ptr ppDoc4;
MSHTML::IHTMLEventObj2Ptr ppEv2;VARIANT vEventObj;
BSTR bstrType;ppElem3 = ppElem;
ppDoc4 = ppDoc2;
ppEv2 = ppDoc4->CreateEventObject( );//bstrType = SysAllocString( L"onmousedown" );
bstrType = SysAllocString( L"mousedown" );ppEv2->put_type( bstrType );
ppEv2->putref_srcElement( ppElem );
//ppEv2->putref_toElement( ppElem );
vEventObj.vt = VT_DISPATCH;
vEventObj.pdispVal = ppEv2;
VARIANT_BOOL ret = ppElem3->FireEvent(bstrType, &vEventObj);
//1 Left button is pressed.
//2 Right button is pressed.
//3 Left and right buttons are both pressed.
//4 Middle button is pressed.
//5 Left and middle buttons both are pressed.
//6 Right and middle buttons are both pressed.
//7 All three buttons are pressed. ppEv2->put_button(1);但是还是出现问题
---------------------------
Microsoft Visual C++
---------------------------
Unhandled exception in MSHTML.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.
---------------------------
确定
---------------------------
inline VARIANT_BOOL MSHTML::IHTMLElement3::FireEvent ( _bstr_t bstrEventName, VARIANT * pvarEventObject ) {
VARIANT_BOOL _result;
HRESULT _hr = raw_FireEvent(bstrEventName, pvarEventObject, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _result;
}跟入此函数发现 _hr = 0x80070057
E_INVALIDARG 0x80070057 参数错误
E_OUTOFMEMORY 0x8007000E 内存错误 说明是参数错误.
此时两个参数,一个为bstrEventName, 一个为pvarEventObject .采用排除法
1:
将bstrEventName 设为onmousedown
此时_hr = 0; _result=-1;2:
将bstrEventName 设为onclick
此时_hr = 0; _result=-1;3:将bstrEventName 设为click
此时_hr = 0x80070057; _result=0xcc; //说明没有执行4:将bstrEventName 设为mousedown
此时_hr = 0x80070057; _result=0xcc; //说明没有执行5:将bstrEventName 设为aaa( 设一个乱数)
此时_hr = 0x80070057; _result=0xcc; //说明没有执行由此说明,bstrEventName必须是on开头的事件
但问题还是未能解决.事件没有正确传递过去
_variant_t v = disp;
ppElem3->fireEvent("onmousedown", disp);