我自己定义了一个从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;
结果程序发生异常了,请问各位仁兄是怎么回事??
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;
结果程序发生异常了,请问各位仁兄是怎么回事??
代码如下:
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;
}
};