Jacek Caban : shlwapi: Reimplement IUnknown_CPContainerInvokeParam on top of SHPackDispParams.
Alexandre Julliard
julliard at winehq.org
Mon Nov 12 06:27:30 CST 2007
Module: wine
Branch: master
Commit: f58d9a94faed2973a1746873c1027587a933b950
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f58d9a94faed2973a1746873c1027587a933b950
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Nov 12 01:25:17 2007 +0100
shlwapi: Reimplement IUnknown_CPContainerInvokeParam on top of SHPackDispParams.
---
dlls/shlwapi/ordinal.c | 63 ++++++++++--------------------------------------
1 files changed, 13 insertions(+), 50 deletions(-)
diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index 91f3199..8dc0ffa 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -2986,64 +2986,27 @@ HRESULT WINAPIV IUnknown_CPContainerInvokeParam(
HRESULT result;
IConnectionPoint *iCP;
IConnectionPointContainer *iCPC;
+ DISPPARAMS dispParams = {buffer, NULL, cParams, 0};
+ va_list valist;
if (!container)
return E_NOINTERFACE;
result = IUnknown_QueryInterface(container, &IID_IConnectionPointContainer,(LPVOID*) &iCPC);
- if (SUCCEEDED(result))
- {
- result = IConnectionPointContainer_FindConnectionPoint(iCPC, riid, &iCP);
- IConnectionPointContainer_Release(iCPC);
- }
+ if (FAILED(result))
+ return result;
- if (SUCCEEDED(result))
- {
- ULONG cnt;
- VARIANTARG *curvar = buffer+cParams-1;
- DISPPARAMS dispParams = {buffer, NULL, cParams, 0};
- va_list valist;
+ result = IConnectionPointContainer_FindConnectionPoint(iCPC, riid, &iCP);
+ IConnectionPointContainer_Release(iCPC);
+ if(FAILED(result))
+ return result;
- va_start(valist, cParams);
- for(cnt=cParams;cnt>0;cnt--,curvar--) /* backwards for some reason */
- {
- enum VARENUM vt = va_arg(valist, enum VARENUM);
- memset(curvar, 0, sizeof(*curvar));
- if (vt & VT_BYREF)
- {
- V_VT(curvar) = vt;
- V_BYREF(curvar) = va_arg(valist, LPVOID);
- } else
- switch(vt)
- {
- case VT_BSTR:
- V_VT(curvar) = vt;
- V_BSTR(curvar) = va_arg(valist, BSTR);
- break;
- case VT_DISPATCH:
- V_VT(curvar) = vt;
- V_DISPATCH(curvar) = va_arg(valist, IDispatch*);
- break;
- case VT_BOOL:
- V_VT(curvar) = vt;
- V_BOOL(curvar) = va_arg(valist, int);
- break;
- case VT_UNKNOWN:
- V_VT(curvar) = vt;
- V_UNKNOWN(curvar) = va_arg(valist, IUnknown*);
- break;
- case VT_I4:
- default:
- V_VT(curvar) = VT_I4;
- V_I4(curvar) = va_arg(valist, LONG);
- break;
- }
- }
- va_end(valist);
+ va_start(valist, cParams);
+ SHPackDispParamsV(&dispParams, buffer, cParams, valist);
+ va_end(valist);
- result = SHLWAPI_InvokeByIID(iCP, riid, dispId, &dispParams);
- IConnectionPoint_Release(iCP);
- }
+ result = SHLWAPI_InvokeByIID(iCP, riid, dispId, &dispParams);
+ IConnectionPoint_Release(iCP);
return result;
}
More information about the wine-cvs
mailing list