home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 August / Chip_2000-08_cd1.bin / sharewar / dvcpp / _SETUP.5 / Group3 / rpcproxy.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-03-08  |  8.3 KB  |  180 lines

  1. /*
  2.     -DREGISTER_PROXY_DLL Generates DllMain, DllRegisterServer, and DllUnregisterServer
  3.     -DPROXY_CLSID=clsid Specifies a class ID to be used by the proxy DLL.
  4.     -DPROXY_CLSID_IS={..} Specifies the class ID to be used by the proxy DLL.
  5.     -DNT35_STRICT No new features
  6. */
  7. #ifndef _RPCPROXY_H
  8. #define _RPCPROXY_H
  9. #include <rpc.h>
  10. #include <rpcndr.h>
  11. #include <string.h>
  12.  
  13. #define CStdStubBuffer_METHODS CStdStubBuffer_QueryInterface,CStdStubBuffer_AddRef,\
  14. CStdStubBuffer_Release,CStdStubBuffer_Connect,CStdStubBuffer_Disconnect,CStdStubBuffer_Invoke,\
  15. CStdStubBuffer_IsIIDSupported,CStdStubBuffer_CountRefs,CStdStubBuffer_DebugServerQueryInterface,\
  16. CStdStubBuffer_DebugServerRelease
  17. #define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp(pIID,name##_ProxyVtblList[index]->header.piid,16)
  18. #define IID_BS_LOOKUP_SETUP int result, low=-1;
  19. #define IID_BS_LOOKUP_INITIAL_TEST(name,sz,split) if ((result = name##_CHECK_IID(split))>0) { low=sz-split;} else if (!result) { low = split; goto found_label; }
  20. #define IID_BS_LOOKUP_NEXT_TEST(name,split) if ((result = name##_CHECK_IID(low+split))>=0) { low=low+split; if (!result) goto found_label; }
  21. #define IID_BS_LOOKUP_RETURN_RESULT(name,sz,index) low+=1; if ((low>=sz )||(result=name##_CHECK_IID(low))) goto not_found_label; found_label: (index)=low; return 1; not_found_label: return 0;
  22. #define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \
  23. HINSTANCE hProxyDll = 0; \
  24. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) \
  25. { \
  26. if(fdwReason == DLL_PROCESS_ATTACH) hProxyDll = hinstDLL; \
  27. return TRUE; \
  28. } \
  29. HRESULT STDAPICALLTYPE DllRegisterServer() \
  30. {\
  31. return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \
  32. }\
  33. HRESULT STDAPICALLTYPE DllUnregisterServer()\
  34. {\
  35. return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID);\
  36. }
  37. #ifdef PROXY_CLSID
  38. #define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID;
  39. #else
  40. #ifdef PROXY_CLSID_IS
  41. #define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;
  42. #define PROXY_CLSID CLSID_PSFactoryBuffer
  43. #else
  44. #define CLSID_PSFACTORYBUFFER
  45. #endif
  46. #endif
  47. #ifndef PROXY_CLSID
  48. #define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] != 0 ? aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)
  49. #else
  50. #define GET_DLL_CLSID &PROXY_CLSID
  51. #endif
  52. #define EXTERN_PROXY_FILE(name) EXTERN_C const ProxyFileInfo name##_ProxyFileInfo;
  53. #define PROXYFILE_LIST_START const ProxyFileInfo * aProxyFileList[] = {
  54. #define REFERENCE_PROXY_FILE(name) & name##_ProxyFileInfo
  55. #define PROXYFILE_LIST_END 0 };
  56. #define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \
  57. void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId ) \
  58. { *pInfo = pPFList; *pId = pClsid; };
  59. #define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory) HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppv) \
  60. { return NdrDllGetClassObject(rclsid,riid,ppv,pPFlist,pClsid,pFactory ); }
  61. #define DLLCANUNLOADNOW(pFactory) HRESULT STDAPICALLTYPE DllCanUnloadNow() \
  62. { return NdrDllCanUnloadNow( pFactory ); }
  63. #define DLLDUMMYPURECALL void __cdecl _purecall(void) { }
  64. #define CSTDSTUBBUFFERRELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \
  65. { return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory); }
  66. #ifdef PROXY_DELEGATION
  67. #define CSTDSTUBBUFFER2RELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \
  68. { return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory); }
  69. #else
  70. #define CSTDSTUBBUFFER2RELEASE(pFactory)
  71. #endif
  72.  
  73. #ifdef REGISTER_PROXY_DLL
  74. #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID)
  75. #else
  76. #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID)
  77. #endif
  78. #define DLLDATA_ROUTINES(pProxyFileList,pClsID) \
  79. CLSID_PSFACTORYBUFFER \
  80. CStdPSFactoryBuffer gPFactory = {0,0,0,0}; \
  81. DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \
  82. DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory) \
  83. DLLCANUNLOADNOW(&gPFactory) \
  84. CSTDSTUBBUFFERRELEASE(&gPFactory) \
  85. CSTDSTUBBUFFER2RELEASE(&gPFactory) \
  86. DLLDUMMYPURECALL \
  87. DLLREGISTRY_ROUTINES(pProxyFileList, pClsID)
  88.  
  89. #define DLLDATA_STANDARD_ROUTINES DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer)
  90.  
  91. struct tagCInterfaceStubVtbl;
  92. struct tagCInterfaceProxyVtbl;
  93. typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList;
  94. typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList;
  95. typedef const char *PCInterfaceName;
  96. typedef int __stdcall IIDLookupRtn(const IID*,int*);
  97. typedef IIDLookupRtn *PIIDLookup;
  98. typedef struct tagProxyFileInfo {
  99.     const PCInterfaceProxyVtblList *pProxyVtblList;
  100.     const PCInterfaceStubVtblList *pStubVtblList;
  101.     const PCInterfaceName * pNamesArray;
  102.     const IID ** pDelegatedIIDs;
  103.     const PIIDLookup pIIDLookupRtn;
  104.     unsigned short TableSize;
  105.     unsigned short TableVersion;
  106.     unsigned long Filler1;
  107.     unsigned long Filler2;
  108.     unsigned long Filler3;
  109.     unsigned long Filler4;
  110. }ProxyFileInfo;
  111. typedef ProxyFileInfo ExtendedProxyFileInfo;
  112.  
  113. typedef struct tagCInterfaceProxyHeader {
  114. #ifdef USE_STUBLESS_PROXY
  115.     const void *pStublessProxyInfo;
  116. #endif
  117.     const IID *piid;
  118. } CInterfaceProxyHeader;
  119. typedef struct tagCInterfaceProxyVtbl {
  120.     CInterfaceProxyHeader header;
  121.     void *Vtbl[0];
  122. } CInterfaceProxyVtbl;
  123. typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
  124. typedef struct tagCInterfaceStubHeader {
  125.     const IID *piid;
  126.     const MIDL_SERVER_INFO *pServerInfo;
  127.     unsigned long DispatchTableCount;
  128.     const PRPC_STUB_FUNCTION *pDispatchTable;
  129. } CInterfaceStubHeader;
  130. typedef struct tagCInterfaceStubVtbl {
  131.     CInterfaceStubHeader header;
  132.     IRpcStubBufferVtbl Vtbl;
  133. } CInterfaceStubVtbl;
  134. typedef struct tagCStdStubBuffer {
  135.     const struct IRpcStubBufferVtbl * lpVtbl;
  136.     long RefCount;
  137.     struct IUnknown *pvServerObject;
  138. } CStdStubBuffer;
  139. typedef struct tagCStdPSFactoryBuffer {
  140.     const IPSFactoryBufferVtbl *lpVtbl;
  141.     long RefCount;
  142.     const ProxyFileInfo ** pProxyFileList;
  143.     long Filler1;
  144. } CStdPSFactoryBuffer;
  145. void RPC_ENTRY NdrProxyInitialize(void*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int);
  146. void RPC_ENTRY NdrProxyGetBuffer(void*,PMIDL_STUB_MESSAGE);
  147. void RPC_ENTRY NdrProxySendReceive(void*,MIDL_STUB_MESSAGE*);
  148. void RPC_ENTRY NdrProxyFreeBuffer(void*,MIDL_STUB_MESSAGE*);
  149. HRESULT RPC_ENTRY NdrProxyErrorHandler(DWORD);
  150. void RPC_ENTRY NdrStubInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,IRpcChannelBuffer*);
  151. void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
  152. void RPC_ENTRY NdrStubGetBuffer(IRpcStubBuffer*,IRpcChannelBuffer*,PMIDL_STUB_MESSAGE);
  153. HRESULT RPC_ENTRY NdrStubErrorHandler(DWORD);
  154. HRESULT STDMETHODCALLTYPE CStdStubBuffer_QueryInterface(IRpcStubBuffer*,REFIID,void**);
  155. ULONG STDMETHODCALLTYPE CStdStubBuffer_AddRef(IRpcStubBuffer*);
  156. ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer*);
  157. ULONG STDMETHODCALLTYPE NdrCStdStubBuffer_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
  158. HRESULT STDMETHODCALLTYPE CStdStubBuffer_Connect(IRpcStubBuffer*,IUnknown*);
  159. void STDMETHODCALLTYPE CStdStubBuffer_Disconnect(IRpcStubBuffer*);
  160. HRESULT STDMETHODCALLTYPE CStdStubBuffer_Invoke(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*);
  161. IRpcStubBuffer* STDMETHODCALLTYPE CStdStubBuffer_IsIIDSupported(IRpcStubBuffer*,REFIID);
  162. ULONG STDMETHODCALLTYPE CStdStubBuffer_CountRefs(IRpcStubBuffer*);
  163. HRESULT STDMETHODCALLTYPE CStdStubBuffer_DebugServerQueryInterface(IRpcStubBuffer*,void**);
  164. void STDMETHODCALLTYPE CStdStubBuffer_DebugServerRelease(IRpcStubBuffer*,void*);
  165. HRESULT RPC_ENTRY NdrDllGetClassObject(REFCLSID,REFIID,void**,const ProxyFileInfo**,const CLSID*,CStdPSFactoryBuffer*);
  166. HRESULT RPC_ENTRY NdrDllCanUnloadNow(CStdPSFactoryBuffer*);
  167. #ifndef NT35_STRICT
  168. HRESULT RPC_ENTRY NdrDllRegisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
  169. HRESULT RPC_ENTRY NdrDllUnregisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
  170. #define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction
  171. ULONG STDMETHODCALLTYPE
  172. CStdStubBuffer2_Release(IRpcStubBuffer*);
  173. ULONG STDMETHODCALLTYPE
  174. NdrCStdStubBuffer2_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
  175. #define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0
  176. #endif
  177.  
  178. #endif
  179.  
  180.