Andrey Turkin : shlwapi: Implement IUnknown_CPContainerInvokeParam.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 4 07:11:11 CDT 2007


Module: wine
Branch: master
Commit: 82997149528bf50c61d91feb0ab2b431214cd571
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=82997149528bf50c61d91feb0ab2b431214cd571

Author: Andrey Turkin <andrey.turkin at gmail.com>
Date:   Fri May  4 10:46:36 2007 +0400

shlwapi: Implement IUnknown_CPContainerInvokeParam.

---

 dlls/shlwapi/ordinal.c    |   77 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/shlwapi/shlwapi.spec |    2 +-
 2 files changed, 78 insertions(+), 1 deletions(-)

diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index f480482..213980c 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -2962,6 +2962,83 @@ HRESULT WINAPI IConnectionPoint_OnChanged(IConnectionPoint* lpCP, DISPID dispID)
 }
 
 /*************************************************************************
+ *      @	[SHLWAPI.286]
+ *
+ *  IUnknown_CPContainerInvokeParam
+ */
+HRESULT WINAPIV IUnknown_CPContainerInvokeParam(
+        IUnknown *container,
+        REFIID riid,
+        DISPID dispId,
+        VARIANTARG* buffer,
+        DWORD cParams, ...)
+{
+  HRESULT result;
+  IConnectionPoint *iCP;
+  IConnectionPointContainer *iCPC;
+
+  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 (SUCCEEDED(result))
+  {
+    ULONG cnt;
+    VARIANTARG *curvar = buffer+cParams-1;
+    DISPPARAMS dispParams = {buffer, NULL, cParams, 0};
+    va_list valist;
+
+    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);
+
+    result = SHLWAPI_InvokeByIID(iCP, riid, dispId, &dispParams);
+    IConnectionPoint_Release(iCP);
+  }
+
+  return result;
+}
+
+/*************************************************************************
  *      @	[SHLWAPI.287]
  *
  * Notify an IConnectionPointContainer object of changes.
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index cca778d..ec7d259 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -283,7 +283,7 @@
 283 stub -noname IConnectionPoint_InvokeWithCancel
 284 stdcall -noname IConnectionPoint_SimpleInvoke(ptr long ptr)
 285 stdcall -noname IConnectionPoint_OnChanged(ptr long)
-286 stub -noname IUnknown_CPContainerInvokeParam
+286 varargs -noname IUnknown_CPContainerInvokeParam(ptr ptr long ptr long)
 287 stdcall -noname IUnknown_CPContainerOnChanged(ptr long)
 288 stub -noname IUnknown_CPContainerInvokeIndirect
 289 stdcall -noname PlaySoundWrapW(wstr long long)




More information about the wine-cvs mailing list