InterfaceProxy.h
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:4k
开发平台:

MultiPlatform

  1. /* InterfaceProxy.h - COM/DCOM InterfaceProxy class definition */
  2. /* Copyright (c) 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01n,24jul01,dbs  add public inner-proxy structure
  7. 01m,19jul01,dbs  fix include-path of Remoting.h
  8. 01l,13jul01,dbs  fix up includes
  9. 01k,06jul99,dbs  add copy-ctor and assignment-operator
  10. 01j,10jun99,dbs  remove inclusion of comNew.h
  11. 01i,03jun99,dbs  remove refs to comSyncLib
  12. 01h,13may99,dbs  remove usage of IRpcChannelBuffer
  13. 01g,11may99,dbs  simplify proxy remoting architecture
  14. 01f,11may99,dbs  change name of ChannelBuffer.h to Remoting.h
  15. 01e,29apr99,dbs  fix -Wall warnings
  16. 01d,28apr99,dbs  make all classes allocate from same pool
  17. 01c,27apr99,dbs  add mem-pool to class
  18. 01b,21apr99,dbs  add include for IRpcChannelBuffer
  19. 01a,20apr99,dbs  created during Grand Renaming
  20. */
  21. #ifndef __INCInterfaceProxy_h
  22. #define __INCInterfaceProxy_h
  23. #include "private/comMisc.h"
  24. #include "dcomLib.h"
  25. #include "orpc.h"
  26. ///////////////////////////////////////////////////////////////////////////
  27. //
  28. // VxInterfaceProxy - a single-interface proxy object that can be
  29. // aggregated by the 'proxy manager' VxStdProxy and represents a
  30. // single interface on a 'remoted' object.
  31. //
  32. // It will be used by the proxy-stub generation code to implement the
  33. // methods for the real proxy when standard marshaling is used. The
  34. // actual implementation of the managed-interface methods takes place
  35. // in functions in the managed vtable.
  36. //
  37. // The class implements IUnknown directly -- this is the 'real'
  38. // IUnknown for the facelet, and so it manages the facelet's own
  39. // reference count. The 'managed interface' is contained in a
  40. // 'interface_t' structure, which is returned when a VxInterfaceProxy
  41. // is QI'ed for the managed IID.
  42. //
  43. // This implements the aggregation necessary for the managed interface
  44. // to appear as part of the containing StdProxy -- the interface_t
  45. // object defers its IUnknown methods to the StdProxy, and the
  46. // VxInterfaceProxy's own implementation of IUnknown provides the
  47. // private IUnknown that is only seen by the aggregating StdProxy...
  48. //
  49. // The XXX_vxproxy functions generated by WIDL for the managed
  50. // interface are conceptually the methods of this interface-proxy's
  51. // implementation of the managed interface. They are present in the
  52. // vtable and so are effectively part fo this interface proxy.
  53. //
  54. // However, for method calls to be dispatched, the only requirement is
  55. // that the proxy eventually calls IOprcClientChannel::InvokeMethod()
  56. // which happens in the SendReceive() method of RpcProxyMsg for normal
  57. // interfaces (i.e. those handled by standard marshaling). If an
  58. // alternate proxy/stub class were associated with a particular
  59. // interface (e.g. to do custom marshaling), then it would either need
  60. // to call that function itself (which is why the IOrpcProxy interface
  61. // has the Connect() and Disconnect() methods, so it has access to the
  62. // channel), or it must arrange for data to be sent to the remote
  63. // machine itself, somehow.
  64. //
  65. class VxInterfaceProxy;
  66. struct interface_t
  67.     {
  68.     const void *        lpVtbl;         // inner interface impl
  69.     long                magic;          // magic ID value
  70.     VxInterfaceProxy *  backptr;        // validation pointer
  71.     };
  72. class VxInterfaceProxy : public IOrpcProxy
  73.     {
  74.     interface_t         m_interface;    // managed interface
  75.     IID m_iidManaged; // IID of inner interface
  76.     IPID m_ipid; // IPID of exposed interface
  77.     LONG         m_dwRefCount; // reference count
  78.     IUnknown *          m_pUnkOuter;    // aggregating outer
  79.     IOrpcClientChannel* m_pChannel;     // client channel
  80.     VxInterfaceProxy& operator= (const VxInterfaceProxy&);
  81.     VxInterfaceProxy::VxInterfaceProxy (const VxInterfaceProxy&);
  82.   public:
  83.     // ctor and dtor
  84.     VxInterfaceProxy (REFIID, REFIPID, IUnknown*, const void*);
  85.     virtual ~VxInterfaceProxy ();
  86.     HRESULT interfaceInfoGet (IPID*, IOrpcClientChannel**);
  87.     IUnknown* pUnkOuter () const { return m_pUnkOuter; }
  88.     
  89.     // find containing interface-proxy from any interface pointer
  90.     static VxInterfaceProxy* safe_cast (const void*);
  91.     // IOrpcProxy methods
  92.     STDMETHOD(QueryInterface) (REFIID riid, void** ppv);
  93.     STDMETHOD_(ULONG, AddRef) ();
  94.     STDMETHOD_(ULONG, Release) ();
  95.     STDMETHOD(Connect) (IOrpcClientChannel*);
  96.     STDMETHOD(Disconnect) ();
  97.     };
  98. #endif