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
10 #pragma GCC system_header
13 #if defined __cplusplus && !defined CINTERFACE
14 #warning "rpcproxy type definitions require CINTERFACE"
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) \
36 if(fdwReason == DLL_PROCESS_ATTACH) hProxyDll = hinstDLL; \
39 HRESULT STDAPICALLTYPE DllRegisterServer(void) \
41 return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \
43 HRESULT STDAPICALLTYPE DllUnregisterServer(void)\
45 return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID);\
48 #define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID;
51 #define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;
52 #define PROXY_CLSID CLSID_PSFactoryBuffer
54 #define CLSID_PSFACTORYBUFFER
58 #define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] != 0 ? aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)
60 #define GET_DLL_CLSID &PROXY_CLSID
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); }
80 #define CSTDSTUBBUFFER2RELEASE(pFactory)
83 #ifdef REGISTER_PROXY_DLL
84 #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID)
86 #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID)
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) \
97 DLLREGISTRY_ROUTINES(pProxyFileList, pClsID)
99 #define DLLDATA_STANDARD_ROUTINES DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer)
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
;
121 typedef ProxyFileInfo ExtendedProxyFileInfo
;
123 typedef struct tagCInterfaceProxyHeader
{
124 #ifdef USE_STUBLESS_PROXY
125 const void *pStublessProxyInfo
;
128 } CInterfaceProxyHeader
;
129 typedef struct tagCInterfaceProxyVtbl
{
130 CInterfaceProxyHeader header
;
131 #if defined(__WATCOMC__)
139 } CInterfaceProxyVtbl
;
140 typedef void (__RPC_STUB
*PRPC_STUB_FUNCTION
)(IRpcStubBuffer
*,IRpcChannelBuffer
*,PRPC_MESSAGE
,DWORD
*);
141 typedef struct tagCInterfaceStubHeader
{
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
;
154 struct IUnknown
*pvServerObject
;
155 const struct ICallFactoryVtbl
* pCallFactoryVtbl
;
156 const IID
* pAsyncIID
;
157 struct IPSFactoryBuffer
* pPSFactory
;
158 const struct IReleaseMarshalBuffersVtbl
* pRMBVtbl
;
160 typedef struct tagCStdPSFactoryBuffer
{
161 const IPSFactoryBufferVtbl
*lpVtbl
;
163 const ProxyFileInfo
** pProxyFileList
;
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
*);
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
202 #endif /* defined __cplusplus && !defined CINTERFACE */
203 #endif /* ndef _RPCPROXY_H */