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