PATCH: DispCallFunc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

This is a very draft implementation of DispCallFunc. Since I do not have 
a testcase (and Fabrice?) has not one either I am not really able
to test it.

The pvargResult is not handled either, since I do not know how. If you have
a application using it, please try.

Ciao, Marcus

License: LGPL
Changelog:
	Draft implementation of DispCallFunc.
	

Index: dlls/oleaut32/typelib.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v
retrieving revision 1.77
diff -u -u -r1.77 typelib.c
--- dlls/oleaut32/typelib.c	31 Jul 2002 17:20:01 -0000	1.77
+++ dlls/oleaut32/typelib.c	6 Nov 2002 18:38:32 -0000
@@ -4192,6 +4192,52 @@
 
 extern int const _argsize(DWORD vt);
 
+HRESULT WINAPI
+DispCallFunc(
+    void* pvInstance, ULONG oVft, CALLCONV cc, VARTYPE vtReturn, UINT cActuals,
+    VARTYPE* prgvt, VARIANTARG** prgpvarg, VARIANT* pvargResult
+) {
+    int i, argsize, argspos;
+    DWORD *args;
+    HRESULT hres;
+
+    FIXME("(%p, %ld, %d, %d, %d, %p, %p, %p)\n",
+	pvInstance, oVft, cc, vtReturn, cActuals, prgvt, prgpvarg, pvargResult
+    );
+    argsize = 0;
+    for (i=0;i<cActuals;i++) {
+        FIXME("arg %d: type %d\n",i,prgvt[i]);
+	dump_Variant(prgpvarg[i]);
+        argsize += _argsize(prgvt[i]);
+    }
+    args = (DWORD*)HeapAlloc(GetProcessHeap(),0,sizeof(DWORD)*argsize);
+    argspos = 0;
+    for (i=0;i<cActuals;i++) {
+	int arglen;
+        VARIANT *arg = prgpvarg[i];
+
+	arglen = _argsize(prgvt[i]);
+	if (V_VT(arg) == prgvt[i]) {
+	    memcpy(&args[argspos],&V_UNION(arg,lVal), arglen*sizeof(DWORD));
+	} else {
+	    if (prgvt[i] == VT_VARIANT) {
+		memcpy(&args[argspos],arg, arglen*sizeof(DWORD));
+	    } else {
+		ERR("Set arg %d to disparg type %d vs %d\n",i,
+			V_VT(arg),prgvt[i]
+		);
+	    }
+	}
+	argspos += arglen;
+    }
+    hres = _invoke((*(DWORD***)pvInstance)[oVft/4],cc,argsize/4,args);
+
+    /* FIXME: Must handle pvargResult. How? */
+
+    HeapFree(GetProcessHeap(),0,args);
+    return hres;
+}
+
 static HRESULT WINAPI ITypeInfo_fnInvoke(
     ITypeInfo2 *iface,
     VOID  *pIUnk,
Index: dlls/oleaut32/oleaut32.spec
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/oleaut32.spec,v
retrieving revision 1.42
diff -u -u -r1.42 oleaut32.spec
--- dlls/oleaut32/oleaut32.spec	8 Jul 2002 19:36:24 -0000	1.42
+++ dlls/oleaut32/oleaut32.spec	6 Nov 2002 18:38:32 -0000
@@ -142,7 +142,7 @@
 142 stdcall VarAnd(ptr ptr ptr) VarAnd
 143 stub VarDiv # stdcall (ptr ptr ptr)
 144 stub OACreateTypeLib2
-146 stub DispCallFunc
+146 stdcall DispCallFunc(ptr long long long long ptr ptr ptr) DispCallFunc
 147 stdcall VariantChangeTypeEx(ptr ptr long long long) VariantChangeTypeEx
 148 stdcall SafeArrayPtrOfIndex(ptr ptr ptr) SafeArrayPtrOfIndex
 149 stdcall SysStringByteLen(ptr) SysStringByteLen


[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux