PATCH: DispCallFunc
Marcus Meissner
marcus at jet.franken.de
Wed Nov 6 13:06:14 CST 2002
On Wed, Nov 06, 2002 at 01:53:40PM -0500, Dimitrie O. Paun wrote:
> On November 6, 2002 01:40 pm, Marcus Meissner wrote:
> > +
> > + FIXME("(%p, %ld, %d, %d, %d, %p, %p, %p)\n",
> > + pvInstance, oVft, cc, vtReturn, cActuals, prgvt, prgpvarg, pvargResult + );
>
> Why is this one a FIXME, and not a TRACE?
Because the function most likely will crash and the user will see that this
function is the problem and we get debug output.
> [snip]
> > + /* FIXME: Must handle pvargResult. How? */
>
> Isn't it better to issue a FIXME here, if pvargResult is not NULL?
I do not think it is supposed to be NULL at all, judging from examples, but
probably yes. I made it a printed message, and more explicit.
Ciao, Marcus
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 19:05:47 -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;
+ }
+
+ FIXME("Do not know how to handle pvargResult %p. Expect crash ...\n",pvargResult);
+
+ hres = _invoke((*(DWORD***)pvInstance)[oVft/4],cc,argsize/4,args);
+ 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 19:05:47 -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
More information about the wine-devel
mailing list