Module: wine Branch: refs/heads/master Commit: bd8fefd66b8457c39420ee146a6bd42effe7ee49 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=bd8fefd66b8457c39420ee14...
Author: Robert Shearman rob@codeweavers.com Date: Sat Dec 3 18:19:17 2005 +0100
OLE: fix invoking dispinterface functions Fix invoking dispinterface functions by using the internal representation of the function, not the one returned to applications.
---
dlls/oleaut32/typelib.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 8e37ea9..07fa031 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5185,25 +5185,29 @@ static HRESULT WINAPI ITypeInfo_fnInvoke { ITypeInfoImpl *This = (ITypeInfoImpl *)iface; int i; - unsigned int func_index, var_index; + unsigned int var_index; TYPEKIND type_kind; HRESULT hres; + const TLBFuncDesc *pFuncInfo;
TRACE("(%p)(%p,id=%ld,flags=0x%08x,%p,%p,%p,%p) partial stub!\n", This,pIUnk,memid,dwFlags,pDispParams,pVarResult,pExcepInfo,pArgErr ); dump_DispParms(pDispParams);
- hres = ITypeInfo2_GetFuncIndexOfMemId(iface, memid, dwFlags, &func_index); - if (SUCCEEDED(hres)) { - FUNCDESC *func_desc; + /* we do this instead of using GetFuncDesc since it will return a fake + * FUNCDESC for dispinterfaces and we want the real function description */ + for (pFuncInfo = This->funclist; pFuncInfo; pFuncInfo=pFuncInfo->next) + if (memid == pFuncInfo->funcdesc.memid && (dwFlags & pFuncInfo->funcdesc.invkind)) + break; + + if (pFuncInfo) { + const FUNCDESC *func_desc = &pFuncInfo->funcdesc;
- hres = ITypeInfo2_GetFuncDesc(iface, func_index, &func_desc); - if(FAILED(hres)) return hres; if (TRACE_ON(ole)) { TRACE("invoking:\n"); - dump_FUNCDESC(func_desc); + dump_TLBFuncDesc(pFuncInfo); }
switch (func_desc->funckind) { @@ -5376,7 +5380,6 @@ func_fail: break; }
- ITypeInfo2_ReleaseFuncDesc(iface, func_desc); TRACE("-- 0x%08lx\n", hres); return hres;