From afb1a08b5f501dc555d254146a5b06b06dade051 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Fri, 19 Mar 2010 14:17:45 +0000 Subject: [PATCH] dispex: Use the upper WORD of the flags parameter to indicate whether the optional [out] parameters are NULL. --- dlls/dispex/tests/marshal.c | 3 --- dlls/dispex/usrmarshal.c | 32 ++++++++++++++++++++------------ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/dlls/dispex/tests/marshal.c b/dlls/dispex/tests/marshal.c index e0b7127cfbd..847f54eb421 100644 --- a/dlls/dispex/tests/marshal.c +++ b/dlls/dispex/tests/marshal.c @@ -244,9 +244,7 @@ static HRESULT WINAPI dispex_InvokeEx(IDispatchEx* iface, if(id == 1) { ok(pdp->cArgs == 0, "got %d\n", pdp->cArgs); -todo_wine ok(pei == NULL, "got non-NULL excepinfo\n"); -todo_wine ok(pvarRes == NULL, "got non-NULL result\n"); } else if(id == 2) @@ -266,7 +264,6 @@ todo_wine } else if(id == 4) { -todo_wine ok(wFlags == 0xf, "got %04x\n", wFlags); } return S_OK; diff --git a/dlls/dispex/usrmarshal.c b/dlls/dispex/usrmarshal.c index cdb1b03da8b..c8c3563aae5 100644 --- a/dlls/dispex/usrmarshal.c +++ b/dlls/dispex/usrmarshal.c @@ -37,6 +37,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); +#define NULL_RESULT 0x20000 +#define NULL_EXCEPINFO 0x40000 + HRESULT CALLBACK IDispatchEx_InvokeEx_Proxy(IDispatchEx* This, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) @@ -47,12 +50,22 @@ HRESULT CALLBACK IDispatchEx_InvokeEx_Proxy(IDispatchEx* This, DISPID id, LCID l UINT byref_args, arg; VARIANT dummy_arg, *ref_arg = &dummy_arg, *copy_arg, *orig_arg = NULL; UINT *ref_idx = NULL; + DWORD dword_flags = wFlags & 0xf; TRACE("(%p)->(%08x, %04x, %04x, %p, %p, %p, %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); - if(!pvarRes) pvarRes = &result; - if(!pei) pei = &excep_info; + if(!pvarRes) + { + pvarRes = &result; + dword_flags |= NULL_RESULT; + } + + if(!pei) + { + pei = &excep_info; + dword_flags |= NULL_EXCEPINFO; + } for(arg = 0, byref_args = 0; arg < pdp->cArgs; arg++) if(V_ISBYREF(pdp->rgvarg + arg)) byref_args++; @@ -86,7 +99,7 @@ HRESULT CALLBACK IDispatchEx_InvokeEx_Proxy(IDispatchEx* This, DISPID id, LCID l pdp->rgvarg = copy_arg; } - hr = IDispatchEx_RemoteInvokeEx_Proxy(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller, + hr = IDispatchEx_RemoteInvokeEx_Proxy(This, id, lcid, dword_flags, pdp, pvarRes, pei, pspCaller, byref_args, ref_idx, ref_arg); if(byref_args) @@ -95,14 +108,6 @@ HRESULT CALLBACK IDispatchEx_InvokeEx_Proxy(IDispatchEx* This, DISPID id, LCID l pdp->rgvarg = orig_arg; } - if(pvarRes == &result) VariantClear(pvarRes); - if(pei == &excep_info) - { - SysFreeString(pei->bstrSource); - SysFreeString(pei->bstrDescription); - SysFreeString(pei->bstrHelpFile); - } - return hr; } @@ -123,7 +128,10 @@ HRESULT __RPC_STUB IDispatchEx_InvokeEx_Stub(IDispatchEx* This, DISPID id, LCID for(arg = 0; arg < byref_args; arg++) pdp->rgvarg[ref_idx[arg]] = ref_arg[arg]; - hr = IDispatchEx_InvokeEx(This, id, lcid, dwFlags, pdp, result, pei, pspCaller); + if(dwFlags & NULL_RESULT) result = NULL; + if(dwFlags & NULL_EXCEPINFO) pei = NULL; + + hr = IDispatchEx_InvokeEx(This, id, lcid, dwFlags & 0xffff, pdp, result, pei, pspCaller); for(arg = 0; arg < byref_args; arg++) VariantInit(pdp->rgvarg + ref_idx[arg]);