wine/dlls/oleaut32 typelib.c
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Nov 9 04:31:20 CST 2005
ChangeSet ID: 21185
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/09 04:31:20
Modified files:
dlls/oleaut32 : typelib.c
Log message:
Robert Shearman <rob at codeweavers.com>
- Cleanup formating of DispCallFunc.
- Fix DispCallFunc for functions with return values.
- Don't rely on _copy_arg as it is going away soon.
Patch: http://cvs.winehq.org/patch.py?id=21185
Old revision New revision Changes Path
1.174 1.175 +26 -25 wine/dlls/oleaut32/typelib.c
Index: wine/dlls/oleaut32/typelib.c
diff -u -p wine/dlls/oleaut32/typelib.c:1.174 wine/dlls/oleaut32/typelib.c:1.175
--- wine/dlls/oleaut32/typelib.c:1.174 9 Nov 2005 10:31:20 -0000
+++ wine/dlls/oleaut32/typelib.c 9 Nov 2005 10:31:20 -0000
@@ -4862,46 +4862,47 @@ static HRESULT typedescvt_to_variantvt(I
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(
More information about the wine-cvs
mailing list