diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index b6dbb426ba090f11ae4706f86d88ca4aa3068dea..2989ca26b693760f34b85dde8ca392b75a0b7dda 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -4862,46 +4862,47 @@ static HRESULT typedescvt_to_variantvt(ITypeInfo *tinfo, TYPEDESC *tdesc, VARTYP
 HRESULT WINAPI
 DispCallFunc(
     void* pvInstance, ULONG oVft, CALLCONV cc, VARTYPE vtReturn, UINT cActuals,
-    VARTYPE* prgvt, VARIANTARG** prgpvarg, VARIANT* pvargResult
-) {
+    VARTYPE* prgvt, VARIANTARG** prgpvarg, VARIANT* pvargResult)
+{
     int i, argsize, argspos;
     DWORD *args;
     HRESULT hres;
 
     TRACE("(%p, %ld, %d, %d, %d, %p, %p, %p (vt=%d))\n",
-	pvInstance, oVft, cc, vtReturn, cActuals, prgvt, prgpvarg, pvargResult, V_VT(pvargResult)
-    );
-    /* DispCallFunc is only used to invoke methods belonging to an IDispatch-derived COM interface.
-    So we need to add a first parameter to the list of arguments, to supply the interface pointer */
+        pvInstance, oVft, cc, vtReturn, cActuals, prgvt, prgpvarg,
+        pvargResult, V_VT(pvargResult));
+
+    /* DispCallFunc is only used to invoke methods belonging to an
+     * IDispatch-derived COM interface. So we need to add a first parameter
+     * to the list of arguments, to supply the interface pointer */
     argsize = 1;
-    for (i=0;i<cActuals;i++) {
-	TRACE("arg %d: type %d, size %d\n",i,prgvt[i],_argsize(prgvt[i]));
-	dump_Variant(prgpvarg[i]);
-	argsize += _argsize(prgvt[i]);
+    for (i=0;i<cActuals;i++)
+    {
+        TRACE("arg %d: type %d, size %d\n",i,prgvt[i],_argsize(prgvt[i]));
+        dump_Variant(prgpvarg[i]);
+        argsize += _argsize(prgvt[i]);
     }
     args = HeapAlloc(GetProcessHeap(),0,sizeof(DWORD)*argsize);
     args[0] = (DWORD)pvInstance;      /* this is the fake IDispatch interface pointer */
     argspos = 1;
-    for (i=0;i<cActuals;i++) {
-	VARIANT *arg = prgpvarg[i];
-	TRACE("Storing arg %d (%d as %d)\n",i,V_VT(arg),prgvt[i]);
-	_copy_arg(NULL, NULL, &args[argspos], arg, prgvt[i]);
-	argspos += _argsize(prgvt[i]);
-    }
-
-    if(pvargResult!=NULL && V_VT(pvargResult)==VT_EMPTY)
+    for (i=0;i<cActuals;i++)
     {
-        _invoke((*(FARPROC**)pvInstance)[oVft/4],cc,argsize,args);
-        hres=S_OK;
+        VARIANT *arg = prgpvarg[i];
+        TRACE("Storing arg %d (%d as %d)\n",i,V_VT(arg),prgvt[i]);
+        memcpy(&args[argspos], &V_NONE(arg), _argsize(prgvt[i]) * sizeof(DWORD));
+        argspos += _argsize(prgvt[i]);
     }
-    else
+
+    hres = _invoke((*(FARPROC**)pvInstance)[oVft/sizeof(void *)],cc,argsize,args);
+    if (pvargResult && (vtReturn != VT_EMPTY))
     {
-        FIXME("Do not know how to handle pvargResult %p. Expect crash ...\n",pvargResult);
-        hres = _invoke((*(FARPROC**)pvInstance)[oVft/4],cc,argsize,args);
-        FIXME("Method returned %lx\n",hres);
+        TRACE("Method returned 0x%08lx\n",hres);
+        V_VT(pvargResult) = vtReturn;
+        V_UI4(pvargResult) = hres;
     }
+
     HeapFree(GetProcessHeap(),0,args);
-    return hres;
+    return S_OK;
 }
 
 static HRESULT WINAPI ITypeInfo_fnInvoke(