执行调用回调IDispEventSimpleImpl类中的InvokeFromFuncInfo函数中,函数
WINOLEAUTAPI DispCallFunc(void * pvInstance, ULONG_PTR oVft, CALLCONV cc,
            VARTYPE vtReturn, UINT  cActuals, VARTYPE * prgvt,
            VARIANTARG ** prgpvarg, VARIANT * pvargResult);
会回调连接点对象的函数,
回调函数执行成功。但上面的DispCallFunc函数却返回失败,返回标志:invalid callee。
不知道应该是哪方面的错误。
代码如下:
class ATL_NO_VTABLE IDispEventSimpleImpl : public _IDispEventLocator<nID, pdiid>
{
     ......
     HRESULT InvokeFromFuncInfo(void (__stdcall T::*pEvent)(), _ATL_FUNC_INFO& info, DISPPARAMS* pdispparams, VARIANT* pvarResult)
    {
ATLASSERT(pdispparams->cArgs == (UINT)info.nParams); T* pT = static_cast<T*>(this); ATLASSERT(info.nParams <= _ATL_MAX_VARTYPES);
if (info.nParams > _ATL_MAX_VARTYPES)
return E_FAIL; VARIANTARG* rgVarArgs[_ATL_MAX_VARTYPES];
VARIANTARG** pVarArgs = info.nParams ? rgVarArgs : 0; UINT nIndex = 0;#ifndef _ATL_IGNORE_NAMED_ARGS
for (nIndex; nIndex < pdispparams->cNamedArgs; nIndex++)
    pVarArgs[pdispparams->rgdispidNamedArgs[nIndex]] = &pdispparams->rgvarg[nIndex];
#endif for (; nIndex < pdispparams->cArgs; nIndex++)
pVarArgs[info.nParams-nIndex-1] = &pdispparams->rgvarg[nIndex]; CComStdCallThunk<T> thunk;
thunk.Init(pEvent, pT); CComVariant tmpResult;
if (pvarResult == NULL)
pvarResult = &tmpResult; HRESULT hr = DispCallFunc(&thunk,0,info.cc,info.vtReturn,info.nParams,info.pVarTypes,pVarArgs,pvarResult);
         //虽然回调函数执行成功,但hr 不是S_OK,是invalid callee,所以会产生断言失败。
ATLASSERT(SUCCEEDED(hr));
return hr;
    }
    ......
    ......请教高手应该考虑那些方面的问题呢?