Robert Shearman : OLE: fix invoking dispinterface functions

Alexandre Julliard julliard at wine.codeweavers.com
Sat Dec 3 12:31:16 CST 2005


Module: wine
Branch: refs/heads/master
Commit: bd8fefd66b8457c39420ee146a6bd42effe7ee49
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=bd8fefd66b8457c39420ee146a6bd42effe7ee49

Author: Robert Shearman <rob at 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;
 




More information about the wine-cvs mailing list