Robert Shearman : oleaut: Small re-organisation of ITypeInfo::Invoke.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 26 11:46:26 CST 2005
Module: wine
Branch: refs/heads/master
Commit: e6fa361967ce788cd9fea6a38a92ec4b9d7e517a
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=e6fa361967ce788cd9fea6a38a92ec4b9d7e517a
Author: Robert Shearman <rob at codeweavers.com>
Date: Mon Dec 26 13:04:31 2005 +0100
oleaut: Small re-organisation of ITypeInfo::Invoke.
Only output the one function in the trace for ITypeInfo::Invoke.
Process the return value on output in ITypeInfo::Invoke, but only copy
it to pVarResult if pVarResult is not NULL.
---
dlls/oleaut32/typelib.c | 68 +++++++++++++++++++++++++----------------------
1 files changed, 36 insertions(+), 32 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 1c56c46..a3e9e86 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -5320,7 +5320,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
if (TRACE_ON(ole))
{
TRACE("invoking:\n");
- dump_TLBFuncDesc(pFuncInfo);
+ dump_TLBFuncDescOne(pFuncInfo);
}
switch (func_desc->funckind) {
@@ -5430,39 +5430,43 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
args
);
- if (pVarResult) {
- for (i = 0; i < func_desc->cParams; i++) {
- USHORT wParamFlags = func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags;
- if (wParamFlags & PARAMFLAG_FRETVAL) {
- ELEMDESC *elemdesc = &func_desc->lprgelemdescParam[i];
- TYPEDESC *tdesc = &elemdesc->tdesc;
- VARIANTARG varresult;
- V_VT(&varresult) = 0;
- hres = typedescvt_to_variantvt((ITypeInfo *)iface, tdesc, &V_VT(&varresult));
- if (hres)
- break;
- /* FIXME: this is really messy - we should keep the
- * args in VARIANTARGs rather than a DWORD array */
- memcpy(&V_UI4(&varresult), &args[i+1], sizeof(DWORD));
- if (TRACE_ON(ole))
- {
- TRACE("varresult: ");
- dump_Variant(&varresult);
- }
- hres = VariantCopyInd(pVarResult, &varresult);
- /* free data stored in varresult. Note that
- * VariantClear doesn't do what we want because we are
- * working with byref types. */
- /* FIXME: clear safearrays, bstrs, records and
- * variants here too */
- if ((V_VT(&varresult) == (VT_UNKNOWN | VT_BYREF)) ||
- (V_VT(&varresult) == (VT_DISPATCH | VT_BYREF)))
- {
- if(*V_UNKNOWNREF(&varresult))
- IUnknown_Release(*V_UNKNOWNREF(&varresult));
- }
+ for (i = 0; i < func_desc->cParams; i++)
+ {
+ USHORT wParamFlags = func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags;
+ if (wParamFlags & PARAMFLAG_FRETVAL)
+ {
+ ELEMDESC *elemdesc = &func_desc->lprgelemdescParam[i];
+ TYPEDESC *tdesc = &elemdesc->tdesc;
+ VARIANTARG varresult;
+ V_VT(&varresult) = 0;
+ hres = typedescvt_to_variantvt((ITypeInfo *)iface, tdesc, &V_VT(&varresult));
+ if (hres)
break;
+ /* FIXME: this is really messy - we should keep the
+ * args in VARIANTARGs rather than a DWORD array */
+ memcpy(&V_UI4(&varresult), &args[i+1], sizeof(DWORD));
+ if (TRACE_ON(ole))
+ {
+ TRACE("varresult: ");
+ dump_Variant(&varresult);
+ }
+
+ if (pVarResult)
+ /* deref return value */
+ hres = VariantCopyInd(pVarResult, &varresult);
+
+ /* free data stored in varresult. Note that
+ * VariantClear doesn't do what we want because we are
+ * working with byref types. */
+ /* FIXME: clear safearrays, bstrs, records and
+ * variants here too */
+ if ((V_VT(&varresult) == (VT_UNKNOWN | VT_BYREF)) ||
+ (V_VT(&varresult) == (VT_DISPATCH | VT_BYREF)))
+ {
+ if(*V_UNKNOWNREF(&varresult))
+ IUnknown_Release(*V_UNKNOWNREF(&varresult));
}
+ break;
}
}
More information about the wine-cvs
mailing list