| /* |
| -DREGISTER_PROXY_DLL Generates DllMain, DllRegisterServer, and DllUnregisterServer |
| -DPROXY_CLSID=clsid Specifies a class ID to be used by the proxy DLL. |
| -DPROXY_CLSID_IS={..} Specifies the class ID to be used by the proxy DLL. |
| -DNT35_STRICT No new features |
| */ |
| #ifndef _RPCPROXY_H |
| #define _RPCPROXY_H |
| #if __GNUC__ >=3 |
| #pragma GCC system_header |
| #endif |
| |
| #if defined __cplusplus && !defined CINTERFACE |
| #warning "rpcproxy type definitions require CINTERFACE" |
| #else |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| #include <rpc.h> |
| #include <rpcndr.h> |
| #include <string.h> |
| |
| #define CStdStubBuffer_METHODS CStdStubBuffer_QueryInterface,CStdStubBuffer_AddRef,\ |
| CStdStubBuffer_Release,CStdStubBuffer_Connect,CStdStubBuffer_Disconnect,CStdStubBuffer_Invoke,\ |
| CStdStubBuffer_IsIIDSupported,CStdStubBuffer_CountRefs,CStdStubBuffer_DebugServerQueryInterface,\ |
| CStdStubBuffer_DebugServerRelease |
| #define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp(pIID,name##_ProxyVtblList[index]->header.piid,16) |
| #define IID_BS_LOOKUP_SETUP int result, low=-1; |
| #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; } |
| #define IID_BS_LOOKUP_NEXT_TEST(name,split) if ((result = name##_CHECK_IID(low+split))>=0) { low=low+split; if (!result) goto found_label; } |
| #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; |
| #define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \ |
| HINSTANCE hProxyDll = 0; \ |
| BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) \ |
| { \ |
| if(fdwReason == DLL_PROCESS_ATTACH) hProxyDll = hinstDLL; \ |
| return TRUE; \ |
| } \ |
| HRESULT STDAPICALLTYPE DllRegisterServer(void) \ |
| {\ |
| return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \ |
| }\ |
| HRESULT STDAPICALLTYPE DllUnregisterServer(void)\ |
| {\ |
| return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID);\ |
| } |
| #ifdef PROXY_CLSID |
| #define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID; |
| #else |
| #ifdef PROXY_CLSID_IS |
| #define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS; |
| #define PROXY_CLSID CLSID_PSFactoryBuffer |
| #else |
| #define CLSID_PSFACTORYBUFFER |
| #endif |
| #endif |
| #ifndef PROXY_CLSID |
| #define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] != 0 ? aProxyFileList[0]->pStubVtblList[0]->header.piid : 0) |
| #else |
| #define GET_DLL_CLSID &PROXY_CLSID |
| #endif |
| #define EXTERN_PROXY_FILE(name) EXTERN_C const ProxyFileInfo name##_ProxyFileInfo; |
| #define PROXYFILE_LIST_START const ProxyFileInfo * aProxyFileList[] = { |
| #define REFERENCE_PROXY_FILE(name) & name##_ProxyFileInfo |
| #define PROXYFILE_LIST_END 0 }; |
| #define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \ |
| void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId ) \ |
| { *pInfo = pPFList; *pId = pClsid; }; |
| #define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory) HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppv) \ |
| { return NdrDllGetClassObject(rclsid,riid,ppv,pPFlist,pClsid,pFactory ); } |
| #define DLLCANUNLOADNOW(pFactory) HRESULT STDAPICALLTYPE DllCanUnloadNow(void) \ |
| { return NdrDllCanUnloadNow( pFactory ); } |
| #define DLLDUMMYPURECALL void __cdecl _purecall(void) { } |
| #define CSTDSTUBBUFFERRELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \ |
| { return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory); } |
| #ifdef PROXY_DELEGATION |
| #define CSTDSTUBBUFFER2RELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \ |
| { return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory); } |
| #else |
| #define CSTDSTUBBUFFER2RELEASE(pFactory) |
| #endif |
| |
| #ifdef REGISTER_PROXY_DLL |
| #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID) |
| #else |
| #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID) |
| #endif |
| #define DLLDATA_ROUTINES(pProxyFileList,pClsID) \ |
| CLSID_PSFACTORYBUFFER \ |
| CStdPSFactoryBuffer gPFactory = {0,0,0,0}; \ |
| DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \ |
| DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory) \ |
| DLLCANUNLOADNOW(&gPFactory) \ |
| CSTDSTUBBUFFERRELEASE(&gPFactory) \ |
| CSTDSTUBBUFFER2RELEASE(&gPFactory) \ |
| DLLDUMMYPURECALL \ |
| DLLREGISTRY_ROUTINES(pProxyFileList, pClsID) |
| |
| #define DLLDATA_STANDARD_ROUTINES DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer) |
| |
| struct tagCInterfaceStubVtbl; |
| struct tagCInterfaceProxyVtbl; |
| typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList; |
| typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList; |
| typedef const char *PCInterfaceName; |
| typedef int __stdcall IIDLookupRtn(const IID*,int*); |
| typedef IIDLookupRtn *PIIDLookup; |
| typedef struct tagProxyFileInfo { |
| const PCInterfaceProxyVtblList *pProxyVtblList; |
| const PCInterfaceStubVtblList *pStubVtblList; |
| const PCInterfaceName * pNamesArray; |
| const IID ** pDelegatedIIDs; |
| const PIIDLookup pIIDLookupRtn; |
| unsigned short TableSize; |
| unsigned short TableVersion; |
| unsigned long Filler1; |
| unsigned long Filler2; |
| unsigned long Filler3; |
| unsigned long Filler4; |
| }ProxyFileInfo; |
| typedef ProxyFileInfo ExtendedProxyFileInfo; |
| |
| typedef struct tagCInterfaceProxyHeader { |
| #ifdef USE_STUBLESS_PROXY |
| const void *pStublessProxyInfo; |
| #endif |
| const IID *piid; |
| } CInterfaceProxyHeader; |
| typedef struct tagCInterfaceProxyVtbl { |
| CInterfaceProxyHeader header; |
| #if defined(__WATCOMC__) |
| void *Vtbl[1]; |
| #else |
| #ifdef __GNUC__ |
| __extension__ |
| #endif |
| void *Vtbl[0]; |
| #endif |
| } CInterfaceProxyVtbl; |
| typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*); |
| typedef struct tagCInterfaceStubHeader { |
| const IID *piid; |
| const MIDL_SERVER_INFO *pServerInfo; |
| unsigned long DispatchTableCount; |
| const PRPC_STUB_FUNCTION *pDispatchTable; |
| } CInterfaceStubHeader; |
| typedef struct tagCInterfaceStubVtbl { |
| CInterfaceStubHeader header; |
| IRpcStubBufferVtbl Vtbl; |
| } CInterfaceStubVtbl; |
| typedef struct tagCStdStubBuffer { |
| const struct IRpcStubBufferVtbl * lpVtbl; |
| long RefCount; |
| struct IUnknown *pvServerObject; |
| const struct ICallFactoryVtbl * pCallFactoryVtbl; |
| const IID * pAsyncIID; |
| struct IPSFactoryBuffer * pPSFactory; |
| const struct IReleaseMarshalBuffersVtbl * pRMBVtbl; |
| } CStdStubBuffer; |
| typedef struct tagCStdPSFactoryBuffer { |
| const IPSFactoryBufferVtbl *lpVtbl; |
| long RefCount; |
| const ProxyFileInfo ** pProxyFileList; |
| long Filler1; |
| } CStdPSFactoryBuffer; |
| void RPC_ENTRY NdrProxyInitialize(void*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int); |
| void RPC_ENTRY NdrProxyGetBuffer(void*,PMIDL_STUB_MESSAGE); |
| void RPC_ENTRY NdrProxySendReceive(void*,MIDL_STUB_MESSAGE*); |
| void RPC_ENTRY NdrProxyFreeBuffer(void*,MIDL_STUB_MESSAGE*); |
| HRESULT RPC_ENTRY NdrProxyErrorHandler(DWORD); |
| void RPC_ENTRY NdrStubInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,IRpcChannelBuffer*); |
| void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*); |
| void RPC_ENTRY NdrStubGetBuffer(IRpcStubBuffer*,IRpcChannelBuffer*,PMIDL_STUB_MESSAGE); |
| HRESULT RPC_ENTRY NdrStubErrorHandler(DWORD); |
| HRESULT STDMETHODCALLTYPE CStdStubBuffer_QueryInterface(IRpcStubBuffer*,REFIID,void**); |
| ULONG STDMETHODCALLTYPE CStdStubBuffer_AddRef(IRpcStubBuffer*); |
| ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer*); |
| ULONG STDMETHODCALLTYPE NdrCStdStubBuffer_Release(IRpcStubBuffer*,IPSFactoryBuffer*); |
| HRESULT STDMETHODCALLTYPE CStdStubBuffer_Connect(IRpcStubBuffer*,IUnknown*); |
| void STDMETHODCALLTYPE CStdStubBuffer_Disconnect(IRpcStubBuffer*); |
| HRESULT STDMETHODCALLTYPE CStdStubBuffer_Invoke(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*); |
| IRpcStubBuffer* STDMETHODCALLTYPE CStdStubBuffer_IsIIDSupported(IRpcStubBuffer*,REFIID); |
| ULONG STDMETHODCALLTYPE CStdStubBuffer_CountRefs(IRpcStubBuffer*); |
| HRESULT STDMETHODCALLTYPE CStdStubBuffer_DebugServerQueryInterface(IRpcStubBuffer*,void**); |
| void STDMETHODCALLTYPE CStdStubBuffer_DebugServerRelease(IRpcStubBuffer*,void*); |
| HRESULT RPC_ENTRY NdrDllGetClassObject(REFCLSID,REFIID,void**,const ProxyFileInfo**,const CLSID*,CStdPSFactoryBuffer*); |
| HRESULT RPC_ENTRY NdrDllCanUnloadNow(CStdPSFactoryBuffer*); |
| #ifndef NT35_STRICT |
| HRESULT RPC_ENTRY NdrDllRegisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*); |
| HRESULT RPC_ENTRY NdrDllUnregisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*); |
| #define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction |
| ULONG STDMETHODCALLTYPE |
| CStdStubBuffer2_Release(IRpcStubBuffer*); |
| ULONG STDMETHODCALLTYPE |
| NdrCStdStubBuffer2_Release(IRpcStubBuffer*,IPSFactoryBuffer*); |
| #define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0 |
| #endif |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif /* defined __cplusplus && !defined CINTERFACE */ |
| #endif /* ndef _RPCPROXY_H */ |
| |