我想在程序中 自动 产生一个事件。如下代码: 
// 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(蒋晟)兄台能给与解答。

解决方案 »

  1.   

    系统是XP。
    以前很少用在线更新。
    为了解决问题。我让其自动升级为IE7
    mshtml.tlb 现在版本是7.0但问题还是没有解决。
    (附D的问题是。我被标记为盗版用户了。呵呵!)
      

  2.   

    事件对象根本就设置错误,不需要你来设置VT_DISPATCH,它本身就是IDispatch接口,你应该设置它的事件属性,例如:
    IHTMLEventObj2Ptr vEventObj2 = ppDoc4->createEventObj(NULL);
    vEventObj2->type = "mousedown";
    vEventObj2->srcElement = ppElem3;
    ppElem3->fireEvent(...)
      

  3.   

    首先谢谢 jameshooo 兄的回复.在你回复之前我曾这样试过:
    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.
    ---------------------------
    确定   
    ---------------------------
      

  4.   

    另:我把最后一句
    VARIANT_BOOL ret = ppElem3->FireEvent(bstrType, &vEventObj); 
    改为
    VARIANT_BOOL ret = ppDoc4->FireEvent(bstrType, &vEventObj);也是同样出错
      

  5.   

    我再帖一下改过的完整的代码:
    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);
      

  6.   

    没有设置event的button等属性?ppEv2明明是IHTMLEventObj2Ptr为什么要当IDispatch用?
      

  7.   

    首先感谢兄台的回复.因为只有IHTMLElement3Ptr 才可以FireEvent. 而FireEvent需要的参数是VARIANT.所以将IHTMLEventObj2Ptr的dispatch传入.另event的button需要怎么设.设成多少?谢谢
      

  8.   

    按兄的提示.加上了一句//Possible Values//0 Default. No button is pressed. 
    //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. 
    --------------------------- 
    确定  
    --------------------------- 
      

  9.   

    #pragma implementation_key(1887)
    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开头的事件
    但问题还是未能解决.事件没有正确传递过去
      

  10.   

    CComQIPtr<IDispatch> disp = ppEv2;
    _variant_t v = disp;
    ppElem3->fireEvent("onmousedown", disp);
      

  11.   

    ppElem3->fireEvent("onmousedown", v);