Andrey Turkin : shlwapi: Implement IConnectionPoint_SimpleInvoke.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 1 07:39:27 CDT 2007


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

Author: Andrey Turkin <andrey.turkin at gmail.com>
Date:   Mon Apr 30 23:11:47 2007 +0400

shlwapi: Implement IConnectionPoint_SimpleInvoke.

---

 dlls/shlwapi/ordinal.c    |   58 +++++++++++++++++++++++++++++++++++++++-----
 dlls/shlwapi/shlwapi.spec |    2 +-
 2 files changed, 52 insertions(+), 8 deletions(-)

diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index dd38eda..f480482 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -2856,17 +2856,61 @@ HRESULT WINAPI SHPackDispParams(LPVOID w, LPVOID x, LPVOID y, LPVOID z)
 }
 
 /*************************************************************************
+ *      SHLWAPI_InvokeByIID
+ *
+ *   This helper function calls IDispatch::Invoke for each sink
+ * which implements given iid or IDispatch.
+ *
+ */
+static HRESULT SHLWAPI_InvokeByIID(
+        IConnectionPoint* iCP,
+        REFIID iid,
+        DISPID dispId,
+        DISPPARAMS* dispParams)
+{
+  IEnumConnections *enumerator;
+  CONNECTDATA rgcd;
+
+  HRESULT result = IConnectionPoint_EnumConnections(iCP, &enumerator);
+  if (FAILED(result))
+    return result;
+
+  while(IEnumConnections_Next(enumerator, 1, &rgcd, NULL)==S_OK)
+  {
+    IDispatch *dispIface;
+    if (SUCCEEDED(IUnknown_QueryInterface(rgcd.pUnk, iid, (LPVOID*)&dispIface)) ||
+        SUCCEEDED(IUnknown_QueryInterface(rgcd.pUnk, &IID_IDispatch, (LPVOID*)&dispIface)))
+    {
+      IDispatch_Invoke(dispIface, dispId, &IID_NULL, 0, DISPATCH_METHOD, dispParams, NULL, NULL, NULL);
+      IDispatch_Release(dispIface);
+    }
+  }
+
+  IEnumConnections_Release(enumerator);
+
+  return S_OK;
+}
+
+/*************************************************************************
  *      @	[SHLWAPI.284]
  *
- * _IConnectionPoint_SimpleInvoke
+ *  IConnectionPoint_SimpleInvoke
  */
-DWORD WINAPI IConnectionPoint_SimpleInvoke(
-	LPVOID x,
-	LPVOID y,
-	LPVOID z)
+HRESULT WINAPI IConnectionPoint_SimpleInvoke(
+        IConnectionPoint* iCP,
+        DISPID dispId,
+        DISPPARAMS* dispParams)
 {
-        FIXME("(%p %p %p) stub\n",x,y,z);
-	return 0;
+  IID iid;
+  HRESULT result;
+
+  TRACE("(%p)->(0x%x %p)\n",iCP,dispId,dispParams);
+
+  result = IConnectionPoint_GetConnectionInterface(iCP, &iid);
+  if (SUCCEEDED(result))
+    result = SHLWAPI_InvokeByIID(iCP, &iid, dispId, dispParams);
+
+  return result;
 }
 
 /*************************************************************************
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index c1cebdd..cca778d 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -281,7 +281,7 @@
 281 stdcall -noname SHPackDispParamsV(ptr ptr ptr ptr)
 282 stdcall -noname SHPackDispParams(ptr ptr ptr ptr)
 283 stub -noname IConnectionPoint_InvokeWithCancel
-284 stdcall -noname IConnectionPoint_SimpleInvoke(ptr ptr ptr)
+284 stdcall -noname IConnectionPoint_SimpleInvoke(ptr long ptr)
 285 stdcall -noname IConnectionPoint_OnChanged(ptr long)
 286 stub -noname IUnknown_CPContainerInvokeParam
 287 stdcall -noname IUnknown_CPContainerOnChanged(ptr long)




More information about the wine-cvs mailing list