我自己定义了一个从IDispatch派生的类,重载了Invoke方法: 
HRESULT STDMETHODCALLTYPE CMyAction::Invoke(DISPID dispId , const IID &rrid , LCID lcid , WORD wFlags , DISPPARAMS *pDispParam ,VARIANT *pVarRet , EXCEPINFO *pExecInfo , UINT *puArgErr)
{
    MessageBox(NULL , "Fuckyou" , "xxxx" , MB_OK);
    return S_OK;
}在我调用的时候,写了如下代码:
CMyAction *myaction = new CMyAction;
VARIANT vDocDisp;
vDocDisp.vt = VT_DISPATCH;
vDocDisp.pdispVal = myaction ;
pElem->put_onclick(vDocDisp);
delete myaction;其中pElem定义为CComPtr <IHTMLElement> pElem;
结果程序发生异常了,请问各位仁兄是怎么回事??  

解决方案 »

  1.   

    还要重载GetIDOfNames方法,返回一个大于等于0的DISPID,并且函数要返回S_OK
      

  2.   

    另外,delete myaction;语句不能放在这里的,应该放在CMyAction::Release里面来执行,当引用计数为0的时候才删除自己。
      

  3.   

    不如把你的CMyAction实现代码都贴上来
      

  4.   


    代码如下:
    class MyCommandHandler : public IDispatch
    {  long refcount;
    public:  MyCommandHandler() :refcount(1){ }
      virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
                /* [out] */ UINT *pctinfo){
        return S_OK;
      }  virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
          /* [in] */ UINT iTInfo,
          /* [in] */ LCID lcid,
          /* [out] */ ITypeInfo **ppTInfo){
          return S_OK;
      }
            
            virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( 
                /* [in] */ REFIID riid,
                /* [size_is][in] */ LPOLESTR *rgszNames,
                /* [in] */ UINT cNames,
                /* [in] */ LCID lcid,
                /* [size_is][out] */ DISPID *rgDispId){
                *rgDispId=1;
                return S_OK;
            }
            
            virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( 
                /* [in] */ DISPID dispIdMember,
                /* [in] */ REFIID riid,
                /* [in] */ LCID lcid,
                /* [in] */ WORD wFlags,
                /* [out][in] */ DISPPARAMS *pDispParams,
                /* [out] */ VARIANT *pVarResult,
                /* [out] */ EXCEPINFO *pExcepInfo,
                /* [out] */ UINT *puArgErr){
                if(dispIdMember==1)
                {
                  MessageBox(0,"Hello World","Hello",0); //place your code here
                }
                return S_OK;
            }  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID classid, void** intf) {
        if (classid == IID_IDispatch)
        {
          *intf = (IDispatch*)this;
          AddRef();
        }
        else
          return E_NOINTERFACE;
        return S_OK;
      }  virtual ULONG STDMETHODCALLTYPE AddRef() {
        InterlockedIncrement(&refcount);
        return refcount;
      }  virtual ULONG STDMETHODCALLTYPE Release() {
        InterlockedDecrement(&refcount);
        if (refcount == 0)
          delete this;
        return refcount;
      }
    };