Помогите найти проблему DispCallFunc SOS
От: Ribmas  
Дата: 27.08.09 13:28
Оценка:
DispCallFunc вызывает нужную функцыя но парамери в нее передаются неправельные. Гляньте пожалуста что я делаю не правельно. Два дня уже потратил.
Заранее благодарен. Дебажыл вроде все параметры правельные.

STDMETHOD
(Invoke)(DISPID dispidMember, REFIID /*riid*/,
LCID /*lcid*/, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* /*pexcepinfo*/, UINT* /*puArgErr*/)
{
if( (DISPATCH_PROPERTYPUT!=wFlags) && (pdispparams->cNamedArgs>0) ) return DISP_E_NONAMEDARGS;
const _ATL_DISPATCH_ENTRY<T>* pMap = T::_GetDispMap();
DISPID i = 1;
while( pMap->pfn!=NULL ) {
DISPID dispid = pMap->dispid==DISPID_UNKNOWN ? i : pMap->dispid;
if( dispidMember==dispid ) {
if( (DISPATCH_PROPERTYPUT==wFlags) && (DISPID_PROPERTYPUT==(pMap+1)->dispid) )
pMap++;
VARTYPE* pArgs = (VARTYPE*) pMap->vtArgs;
if( pArgs == NULL ) pArgs = (VARTYPE*) &pMap->vtSingle;
UINT nArgs = pMap->nArgs;
if( pdispparams->cArgs == nArgs )
{
VARIANT** ppVarArgs = nArgs ? (VARIANT**)_alloca(sizeof(VARIANT*)*nArgs) : NULL;
VARIANT* pVarArgs = nArgs ? (VARIANT*)_alloca(sizeof(VARIANT)*nArgs) : NULL;
UINT i;
for( i=0; i<nArgs; i++ ) {
ppVarArgs[i] = &pVarArgs[i];
::
VariantInit(&pVarArgs[i]);
if( FAILED(::VariantCopyInd(&pVarArgs[i], &pdispparams->rgvarg[nArgs-i-1])) ) return DISP_E_TYPEMISMATCH;
if( FAILED(::VariantChangeType(&pVarArgs[i], &pVarArgs[i], 0, pArgs[i])) ) return DISP_E_TYPEMISMATCH;
}
T *pT = static_cast<T*>(this);
CComStdCallThunk<T> thunk;
thunk.Init(pMap->pfn, pT);
CComVariant tmpResult;
if( pvarResult==NULL ) pvarResult = &tmpResult;
HRESULT Hr = ::DispCallFunc(
&
thunk,
0,
CC_STDCALL,
pMap->vtReturn,
nArgs,
pArgs,
nArgs ? ppVarArgs : NULL,
pvarResult);
for( i=0; i<nArgs; i++ ) ::VariantClear(&pVarArgs[i]);
return Hr;
}
}
i++;
pMap++;
}
return DISP_E_MEMBERNOTFOUND;
}
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.