shlwapi 1/2 [try2]: implement IConnectionPoint_SimpleInvoke

Andrey Turkin andrey.turkin at gmail.com
Mon Apr 30 14:11:47 CDT 2007


-------------- next part --------------
diff -Naurp wine-0.9.36-orig/dlls/shlwapi/ordinal.c wine-0.9.36/dlls/shlwapi/ordinal.c
--- wine-0.9.36-orig/dlls/shlwapi/ordinal.c	2007-04-27 18:48:53.000000000 +0400
+++ wine-0.9.36/dlls/shlwapi/ordinal.c	2007-04-30 22:53:09.031250000 +0400
@@ -2856,17 +2856,61 @@ HRESULT WINAPI SHPackDispParams(LPVOID w
 }
 
 /*************************************************************************
+ *      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 -Naurp wine-0.9.36-orig/dlls/shlwapi/shlwapi.spec wine-0.9.36/dlls/shlwapi/shlwapi.spec
--- wine-0.9.36-orig/dlls/shlwapi/shlwapi.spec	2007-04-27 18:48:53.000000000 +0400
+++ wine-0.9.36/dlls/shlwapi/shlwapi.spec	2007-04-30 21:35:23.859375000 +0400
@@ -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-patches mailing list