Rob Shearman : ole32: Pass in the IID and IUnknown* of the object being executed to the server notification and message filter functions .

Alexandre Julliard julliard at wine.codeweavers.com
Wed Dec 20 08:54:58 CST 2006


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Tue Dec 19 19:37:15 2006 +0000

ole32: Pass in the IID and IUnknown* of the object being executed to the server notification and message filter functions.

---

 dlls/ole32/compobj_private.h |    2 +-
 dlls/ole32/rpc.c             |   16 ++++++++++------
 dlls/ole32/stubmanager.c     |    9 ++++++---
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h
index 5c8f577..aee19f2 100644
--- a/dlls/ole32/compobj_private.h
+++ b/dlls/ole32/compobj_private.h
@@ -200,7 +200,7 @@ BOOL stub_manager_notify_unmarshal(struc
 BOOL stub_manager_is_table_marshaled(struct stub_manager *m, const IPID *ipid);
 void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs, const IPID *ipid);
 HRESULT ipid_to_stub_manager(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **stubmgr_ret);
-HRESULT ipid_get_dispatch_params(const IPID *ipid, APARTMENT **stub_apt, IRpcStubBuffer **stub, IRpcChannelBuffer **chan);
+HRESULT ipid_get_dispatch_params(const IPID *ipid, APARTMENT **stub_apt, IRpcStubBuffer **stub, IRpcChannelBuffer **chan, IID *iid, IUnknown **iface);
 HRESULT start_apartment_remote_unknown(void);
 
 HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnknown *obj, MSHLFLAGS mshlflags);
diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c
index 5d66891..586562e 100644
--- a/dlls/ole32/rpc.c
+++ b/dlls/ole32/rpc.c
@@ -118,6 +118,8 @@ struct dispatch_params
     RPCOLEMESSAGE     *msg; /* message */
     IRpcStubBuffer    *stub; /* stub buffer, if applicable */
     IRpcChannelBuffer *chan; /* server channel buffer, if applicable */
+    IID                iid; /* ID of interface being called */
+    IUnknown          *iface; /* interface being called */
     HANDLE             handle; /* handle that will become signaled when call finishes */
     RPC_STATUS         status; /* status (out) */
     HRESULT            hr; /* hresult (out) */
@@ -586,7 +588,8 @@ static HRESULT WINAPI ClientRpcChannelBu
      * from DllMain */
 
     RpcBindingInqObject(message_state->binding_handle, &ipid);
-    hr = ipid_get_dispatch_params(&ipid, &apt, &params->stub, &params->chan);
+    hr = ipid_get_dispatch_params(&ipid, &apt, &params->stub, &params->chan,
+                                  &params->iid, &params->iface);
     params->handle = ClientRpcChannelBuffer_GetEventHandle(This);
     if ((hr == S_OK) && !apt->multi_threaded)
     {
@@ -954,12 +957,12 @@ void RPC_ExecuteCall(struct dispatch_par
     message_state->prefix_data_len = original_buffer - (char *)msg->Buffer;
     message_state->binding_handle = msg->Handle;
 
-    message_state->channel_hook_info.iid = IID_NULL; /* FIXME */
+    message_state->channel_hook_info.iid = params->iid;
     message_state->channel_hook_info.cbSize = sizeof(message_state->channel_hook_info);
     message_state->channel_hook_info.uCausality = orpcthis.cid;
     message_state->channel_hook_info.dwServerPid = GetCurrentProcessId();
     message_state->channel_hook_info.iMethod = msg->ProcNum;
-    message_state->channel_hook_info.pObject = NULL; /* FIXME */
+    message_state->channel_hook_info.pObject = params->iface;
 
     if (orpcthis.extensions && first_wire_orpc_extent &&
         orpcthis.extensions->size)
@@ -975,8 +978,8 @@ void RPC_ExecuteCall(struct dispatch_par
         DWORD handlecall;
         INTERFACEINFO interface_info;
 
-        interface_info.pUnk = NULL; /* FIXME */
-        interface_info.iid = IID_NULL; /* FIXME */
+        interface_info.pUnk = params->iface;
+        interface_info.iid = params->iid;
         interface_info.wMethod = msg->ProcNum;
         handlecall = IMessageFilter_HandleInComingCall(COM_CurrentApt()->filter,
                                                        CALLTYPE_TOPLEVEL /* FIXME */,
@@ -1033,7 +1036,8 @@ static void __RPC_STUB dispatch_rpc(RPC_
     params = HeapAlloc(GetProcessHeap(), 0, sizeof(*params));
     if (!params) return RpcRaiseException(E_OUTOFMEMORY);
 
-    hr = ipid_get_dispatch_params(&ipid, &apt, &params->stub, &params->chan);
+    hr = ipid_get_dispatch_params(&ipid, &apt, &params->stub, &params->chan,
+                                  &params->iid, &params->iface);
     if (hr != S_OK)
     {
         ERR("no apartment found for ipid %s\n", debugstr_guid(&ipid));
diff --git a/dlls/ole32/stubmanager.c b/dlls/ole32/stubmanager.c
index 520e56d..264a2e5 100644
--- a/dlls/ole32/stubmanager.c
+++ b/dlls/ole32/stubmanager.c
@@ -366,10 +366,11 @@ HRESULT ipid_to_stub_manager(const IPID
 }
 
 /* gets the apartment, stub and channel of an object. the caller must
- * release the references to all objects if the function returned success,
- * otherwise no references are returned. */
+ * release the references to all objects (except iface) if the function
+ * returned success, otherwise no references are returned. */
 HRESULT ipid_get_dispatch_params(const IPID *ipid, APARTMENT **stub_apt,
-                                 IRpcStubBuffer **stub, IRpcChannelBuffer **chan)
+                                 IRpcStubBuffer **stub, IRpcChannelBuffer **chan,
+                                 IID *iid, IUnknown **iface)
 {
     struct stub_manager *stubmgr;
     struct ifstub *ifstub;
@@ -387,6 +388,8 @@ HRESULT ipid_get_dispatch_params(const I
         *chan = ifstub->chan;
         IRpcChannelBuffer_AddRef(*chan);
         *stub_apt = apt;
+        *iid = ifstub->iid;
+        *iface = ifstub->iface;
 
         stub_manager_int_release(stubmgr);
         return S_OK;




More information about the wine-cvs mailing list