|
|
1.1 root 1: // olerem.h - private defintions for OLE implementation of REMoting
2:
3: #if !defined( _OLEREM_H_ )
4: #define _OLEREM_H_
5:
6: // name changes
7: #define ILrpc IRpcChannel
8: #define IStub IRpcStub
9: #define IProxy IRpcProxy
10: #define Dispatch Invoke
11:
12: #define IID_ILrpc IID_IRpcChannel
13: #define IID_IStub IID_IRpcStub
14: #define IID_IProxy IID_IRpcProxy
15:
16: // -----------------------------------------------------------------------
17: // init/term
18:
19: STDAPI RemInitialize(void);
20: STDAPI_(void) RemUninitialize(void);
21:
22: #ifdef _MAC
23: // entry point for lrpc HLE's
24: STDAPI RemProcessLrpcHLE(EventRecord *pHle);
25: #endif
26:
27: extern HINSTANCE hinstSO;
28:
29: // -----------------------------------------------------------------------
30: // Communications Layer
31:
32: typedef LONG OID;
33:
34: STDAPI_(OID) RemAllocOID(LPUNKNOWN pUnk);
35: STDAPI_(BOOL) RemFreeOID(OID oid);
36:
37: // NOTE: ILrpc defined in stdps.h
38:
39: STDAPI RemConnectToObject(OID oid, ILrpc FAR* FAR* ppLrpc);
40: STDAPI RemDisconnectObject(OID oid, DWORD dwReserved);
41:
42:
43: // -----------------------------------------------------------------------
44: // State Management
45:
46: // Class Factory Table
47:
48: STDAPI RemRegisterFactory(REFCLSID rclsid, IUnknown FAR* pUnk, DWORD dwContext,
49: DWORD flags, LPDWORD lpdwRegister);
50: STDAPI RemRevokeFactory(DWORD dwRegister, LPCLSID lpclsid,
51: IUnknown FAR* FAR* ppUnk, LPDWORD lpdwContext);
52: STDAPI RemLookupFactory(REFCLSID rclsid, BOOL fHide,
53: OID FAR *pOid, DWORD FAR* pCookie);
54:
55: // Handler Table
56:
57: interface IProxyManager : public IUnknown
58: {
59: STDMETHOD(CreateServer)(REFCLSID rclsid) = 0;
60: STDMETHOD(Connect)(OID oid, REFCLSID rclsid) = 0;
61: STDMETHOD_(DWORD, LockConnection)(BOOL fLock, BOOL fLastUnlockReleases) = 0;
62: STDMETHOD_(void, GetClassID)(CLSID FAR* pClsid) = 0;
63: STDMETHOD_(OID, GetOID)() = 0;
64: STDMETHOD_(BOOL, IsConnected)(void) = 0;
65: STDMETHOD(EstablishIID)(REFIID iid, LPVOID FAR* ppv) = 0;
66: STDMETHOD_(void, Disconnect)() = 0;
67: };
68:
69: STDAPI RemSetHandler(OID oid, IProxyManager FAR* pPM);
70: STDAPI RemClearHandler(OID oid);
71: STDAPI RemLookupHandler(OID oid, IProxyManager FAR* FAR* ppPM);
72:
73: #ifndef OLE2SHIP
74: STDAPI RemUninitHandlers(void);
75: STDAPI RemUninitServers(void);
76: #endif
77:
78: // Server Table
79:
80: interface IStubManager : public IUnknown
81: {
82: STDMETHOD_(void, SetReg)(OID oid) = 0;
83: STDMETHOD_(void, Connect)(IUnknown FAR* pUnk) = 0;
84: STDMETHOD_(void, Disconnect)() = 0;
85: STDMETHOD_(OID, GetOID)() = 0;
86: STDMETHOD_(IUnknown FAR*, GetServer)(BOOL fAddRef) = 0;
87: STDMETHOD_(void, AddRefRegConn)(DWORD mshlflags) = 0;
88: STDMETHOD_(void, ReleaseRegConn)(DWORD mshlflags) = 0;
89: STDMETHOD_(ULONG, ReleaseLeaveConn)(void) = 0;
90: #ifdef OLE2SHIP
91: STDMETHOD_(ULONG, ReleaseCheckConn)(void) = 0;
92: #endif
93: STDMETHOD_(void, SetPtrStrength)(BOOL fStrong) = 0;
94: STDMETHOD (Dispatch)(REFIID iid, int iMethod, IStream FAR* pIStream,
95: DWORD dwDestCtx, LPVOID lpvDestCtx) = 0;
96: };
97:
98: STDAPI RemRegisterServer(IUnknown FAR* pUnk, DWORD mshlflags, OID FAR* pOid);
99: STDAPI RemRevokeServer(OID oid);
100: STDAPI RemLookupServerUnk(OID oid, IUnknown FAR* FAR* ppUnk, IStubManager FAR* FAR* ppSM);
101: STDAPI RemLookupServerOID(IUnknown FAR* pUnk, OID FAR* oid, IStubManager FAR* FAR* ppSM);
102:
103: // -----------------------------------------------------------------------
104: // Other Routines
105:
106: STDAPI RemCreateRemoteHandler(REFCLSID rclsid, IUnknown FAR* pUnkOuter, REFIID riid, void FAR* FAR* ppv);
107:
108: STDAPI RemCreateRHClassObject(REFCLSID rclsid, REFIID iid, void FAR* FAR* ppv);
109:
110: STDAPI RemEnsureLocalClassObject(REFCLSID rclsid, OID FAR* pOidCF);
111:
112: STDAPI RemEnsureUniqueHandler(REFCLSID rclsid, OID oid, IUnknown FAR* FAR* ppUnk);
113:
114:
115: // REVIEW MM2 (craigwi): these aren't used much; do we keep them?
116:
117: /* -----------------------------------------------------------------------
118: * Proxy/Stub macros
119: *
120: * The follwoing macros can be used to implement Proxy/Stub classes for
121: * classes that support only one or more interfaces other then IUnknown
122: * (and maybe IDebug). The resulting classes will support IProxy, IStub
123: * interface in addition to the interfaces supported by the original class.
124: * Assuming the interfaces supported is IName and it is implemented
125: * by a class CName:
126: *
127: * Declaration (in *.h):
128: *
129: * class CName { class CNameProxy { class CNameStub {
130: * ............ ............ ............
131: * STDUNKDECL(CName,Name) STDUNKDECL(CNameProxy,NameProxy) STDUNKDECL(CNameStub,NameStub)
132: * STDDEBDECL(CName,Name) STDDEBDECL(CNameProxy,NameProxy) STDDEBDECL(CNameStub,NameStub)
133: * STDPROXYDECL(CNameProxy,NameProxy) STDSTUBDECL(NameStub,1)
134: * <IName Declaration> <IName for proxy> <IName for stub>
135: * ............ ............ ............
136: * }; }; };
137: *
138: * Implementation (in *.cpp):
139: *
140: * For original object:
141: *
142: * STDUNKIMPL(Name)
143: *
144: * STDUNK_QI_IMPL(Name,Name)
145: *
146: * STDUNKIMPL_FORDERIVED(Name,NameImpl)
147: *
148: * <Implementation of IName: CNameImpl>
149: *
150: *
151: * For proxy object:
152: *
153: * STDUNKIMPL(NameProxy)
154: *
155: * STDUNK_PROXY_QI_IMPL(NameProxy,Name)
156: *
157: * STDUNKIMPL_FORDERIVED(NameProxy,NameProxyImpl)
158: *
159: * STDPROXYIMPL(NameProxy)
160: *
161: * <Implementation of IName: CNameProxyImpl>
162: *
163: *
164: * For stub object:
165: *
166: * STDUNKIMPL(NameStub)
167: *
168: * STDUNK_STUB_QI_IMPL(NameStub,Name)
169: *
170: * STDUNKIMPL_FORDERIVED(NameStub,NameStubImpl)
171: *
172: * STDSTUBIMPL(NameStub)
173: *
174: * <Implementation of IName: CNameStubImpl>
175: *
176: *
177: */
178:
179: // Mattp: I have moved the body of destructor to the implementation macro. ( STDPROXYIMPL)
180:
181: #define STDPROXYDECL(ignore, classname) \
182: implement CProxy : IProxy { public: \
183: CProxy(C##classname FAR* p##classname) \
184: { m_p##classname = p##classname; } \
185: ~CProxy(void); \
186: STDMETHOD(QueryInterface)(REFIID iid, LPLPVOID ppvObj);\
187: STDMETHOD_(ULONG,AddRef)(void); \
188: STDMETHOD_(ULONG,Release)(void); \
189: STDMETHOD(Connect)(ILrpc FAR* pILrpc); \
190: STDMETHOD_(void, Disconnect)(void); \
191: private: C##classname FAR* m_p##classname; }; \
192: DECLARE_NC(C##classname,CProxy) \
193: CProxy m_Proxy;
194:
195:
196: #ifdef OLE2SHIP
197:
198: #define STDSTUBDECL(ignore, classname,cIface) \
199: implement CStub : IStub { public: \
200: CStub(C##classname FAR* p##classname) \
201: { m_p##classname = p##classname; m_pUnkObject = NULL; } \
202: ~CStub(void) \
203: { M_PROLOG(m_p##classname); if (m_pUnkObject != NULL) m_pUnkObject->Release(); } \
204: INTERNAL_(BOOL) Init(IUnknown FAR* pUnkObject); \
205: STDMETHOD(QueryInterface)(REFIID iid, LPLPVOID ppvObj);\
206: STDMETHOD_(ULONG,AddRef)(void); \
207: STDMETHOD_(ULONG,Release)(void); \
208: STDMETHOD(Connect)(IUnknown FAR* pUnkObject); \
209: STDMETHOD_(void, Disconnect)(void); \
210: STDMETHOD(Dispatch)(REFIID iid, int iMethod, IStream FAR* pIStream, \
211: DWORD dwDestCtx, LPVOID lpvDestCtx); \
212: STDMETHOD_(BOOL, IsIIDSupported)(REFIID iid); \
213: STDMETHOD_(ULONG, CountRefs)(void); \
214: private: C##classname FAR* m_p##classname; \
215: IUnknown FAR* m_pUnkObject; \
216: IUnknown FAR* m_aStubIface[cIface]; }; \
217: DECLARE_NC(C##classname,CStub) \
218: CStub m_Stub;
219:
220: #else
221:
222: #define STDSTUBDECL(ignore, classname,cIface) \
223: implement CStub : IStub { public: \
224: CStub(C##classname FAR* p##classname) \
225: { m_p##classname = p##classname; m_pUnkObject = NULL; } \
226: ~CStub(void) \
227: { M_PROLOG(m_p##classname); if (m_pUnkObject != NULL) m_pUnkObject->Release(); } \
228: INTERNAL_(BOOL) Init(IUnknown FAR* pUnkObject); \
229: STDMETHOD(QueryInterface)(REFIID iid, LPLPVOID ppvObj);\
230: STDMETHOD_(ULONG,AddRef)(void); \
231: STDMETHOD_(ULONG,Release)(void); \
232: STDMETHOD(Connect)(IUnknown FAR* pUnkObject); \
233: STDMETHOD_(void, Disconnect)(void); \
234: STDMETHOD(Dispatch)(REFIID iid, int iMethod, IStream FAR* pIStream, \
235: DWORD dwDestCtx, LPVOID lpvDestCtx); \
236: STDMETHOD_(BOOL, IsIIDSupported)(REFIID iid); \
237: private: C##classname FAR* m_p##classname; \
238: IUnknown FAR* m_pUnkObject; \
239: IUnknown FAR* m_aStubIface[cIface]; }; \
240: DECLARE_NC(C##classname,CStub) \
241: CStub m_Stub;
242:
243: #endif
244:
245:
246: #define CONSTRUCT_PROXY m_Proxy(this),
247: #define CONSTRUCT_STUB m_Stub(this),
248:
249:
250: #define STDUNK_PROXY_QI_IMPL(classname,interfacename) \
251: STDMETHODIMP NC(C##classname,CUnknownImpl)::QueryInterface \
252: (REFIID iidInterface, void FAR* FAR* ppv) { \
253: M_PROLOG(m_p##classname); \
254: if (iidInterface == IID_IUnknown) \
255: { *ppv = (void FAR*)&m_p##classname->m_Unknown; AddRef(); noError; } \
256: else if (iidInterface == IID_I##interfacename) \
257: { *ppv = (void FAR*) &(m_p##classname->m_##classname); \
258: m_p##classname->m_pUnkOuter->AddRef(); noError; } \
259: else if (iidInterface == IID_IProxy) \
260: { *ppv = (void FAR*) &(m_p##classname->m_Proxy); AddRef(); noError; } \
261: else \
262: STDDEB_QI(classname) \
263: { *ppv = NULL; return ResultFromScode(E_NOINTERFACE); } \
264: }
265:
266:
267: #define STDUNK_STUB_QI_IMPL(classname,interfacename) \
268: STDMETHODIMP NC(C##classname,CUnknownImpl)::QueryInterface \
269: (REFIID iidInterface, void FAR* FAR* ppv) { \
270: A5_PROLOG(m_p##classname); \
271: if (iidInterface == IID_IUnknown) \
272: *ppv = (void FAR*)&m_p##classname->m_Unknown; \
273: else if (iidInterface == IID_IStub) \
274: *ppv = (void FAR*) &(m_p##classname->m_Stub); \
275: else \
276: STDDEB_QI(classname) \
277: { *ppv = NULL; RESTORE_A5(); return ResultFromScode(E_NOINTERFACE); } \
278: ++(m_p##classname->m_refs); RESTORE_A5(); noError; }
279:
280: // Mattp: The destructor implementation has been moved to here to allow us the outer
281: // reference to 'm_pILrpc'.
282:
283: #define STDPROXYIMPL(classname) \
284: NC(C##classname,CProxy)::~CProxy(void) \
285: { M_PROLOG(m_p##classname);if (m_p##classname->m_pILrpc) m_p##classname->m_pILrpc->Release();}\
286: STDMETHODIMP NC(C##classname,CProxy)::QueryInterface(REFIID iid, LPLPVOID ppvObj) \
287: { M_PROLOG(m_p##classname);return m_p##classname->m_Unknown.QueryInterface (iid, ppvObj); } \
288: STDMETHODIMP_(ULONG) NC(C##classname,CProxy)::AddRef(void) \
289: { M_PROLOG(m_p##classname);return m_p##classname->m_Unknown.AddRef(); } \
290: STDMETHODIMP_(ULONG) NC(C##classname,CProxy)::Release(void) \
291: { M_PROLOG(m_p##classname);return m_p##classname->m_Unknown.Release(); } \
292: STDMETHODIMP NC(C##classname,CProxy)::Connect(ILrpc FAR* pILrpc) \
293: { \
294: M_PROLOG(m_p##classname); \
295: if (pILrpc) { \
296: pILrpc->AddRef(); \
297: m_p##classname->m_pILrpc = pILrpc; \
298: return NOERROR; \
299: } else \
300: return ResultFromScode(E_UNSPEC); \
301: } \
302: STDMETHODIMP_(void) NC(C##classname,CProxy)::Disconnect(void) \
303: { \
304: M_PROLOG(m_p##classname); \
305: if (m_p##classname->m_pILrpc) \
306: m_p##classname->m_pILrpc->Release(); \
307: m_p##classname->m_pILrpc = NULL; \
308: }
309:
310:
311: #define STDSTUBIMPL(classname) STDUNKIMPL_FORDERIVED(classname,Stub) \
312: STDMETHODIMP NC(C##classname,CStub)::Connect(IUnknown FAR* pUnkObject) \
313: { M_PROLOG(m_p##classname);return Init(pUnkObject) ? NOERROR : ResultFromScode(E_UNSPEC); } \
314: STDMETHODIMP_(void) NC(C##classname,CStub)::Disconnect(void) \
315: {M_PROLOG(m_p##classname); Init(NULL); }
316:
317:
318: /*
319: * Ole2 marshalling stuff
320: *
321: * REVIEW: this should go into ole2sp.h, but ILrpc is defined here and
322: * olerem.h is included after ole2sp.h ...
323: */
324:
325: //
326: // MOP is a single instruction to the interpreter that encodes,
327: // decodes parameters sent via LRPC. A string of Mops describes how to
328: // marshal, unmarshal function's paramaters.
329: //
330: //
331:
332: typedef enum MOP {
333: NilMop,
334: // Basic types size of type (win3.1)
335: Void, // No value 0b
336: This, // FAR* this -- BUGBUG Not used
337: Int, // (INT == int) 2b
338: uInt, // (UINT == unsigned int) 2b
339: Long, // (LONG == long) 4b
340: uLong, // (ULONG == unsigned long) 4b
341: Word, // WORD 2b
342: dWord, // DWORD 4b
343: Bool, // BOOL 2b
344: lpStr, // LPSTR -- (zero terminated)
345: pBuf, // void FAR* -- (size in following long)
346:
347: // Windows types
348: wParam, // WPARAM 2b
349: lParam, // LPARAM 4b
350: _Handle, // HANDLE 2b
351: hWnd, // HWND 2b
352: hGlobal, // GLOBAL HANDLE 2b
353: hMFPict, // METAFILE PICT HANDLE 2b
354: hGDI, // GDI HANDLE 2b
355: _Point, // POINT 4b
356: _Size, // SIZE 4b
357: _Rect, // RECT 8b
358: Msg, // MSG 18b
359:
360: // Ole/Win32 types
361: _Pointl, // POINTL 8b
362: _Sizel, // SIZEL 8b
363: _Rectl, // RECTL 16b
364:
365: // Ole types
366: Hresult, // HRESULT 4b
367: Cid, // CID 16b
368: Iid, // IID 16b
369: wChar, // WCHAR 2b
370: Time, // TIME_T 4b
371: StatStg, // STATSTG > 38b + size of member lpstr
372: Layout, // OLELAYOUT 2b BUGBUG - bad size
373: ClipFor, // CLIPFORMAT 2b BUGBUG - MAC bad size
374: DAspect, // DVASPECT 4b
375: TyMed, // TYMED 4b
376: Verb, // OLEVERB > 14b + size of member lpstr
377: TDev, // DVTARGETDEVICE > 16b
378: SMedium, // STGMEDIUM > 12b + size of member lpstr
379: ForEtc, // FORMATETC > 18b + size of member tdev
380: StatDat, // STATDATA > 48b + size of member foretc
381: IFace, // interface FAR* > 40b
382: MenuWidths, // OLEMENUGROUP_WIDTHS 24b
383: hMenu, // HMENU 2b
384: hOMenu, // HOLEMENU 2b
385: hAccel, // HACCEL 2b
386: FrameInfo, // OLEINPLACEFRAMEINFO 10b
387: BindOpt, // BIND_OPTS 12b BUGBUG might change
388: LogPal, // LOGPALETTE > 8b
389:
390: // Modifiers
391: MMask = 0xc0,
392: MIn = 0x40, // FAR Pointer to in parameter
393: MOut = 0x80, // FAR Pointer to out parameter
394: MIO = 0xc0, // FAR Pointer to in, out parameter
395:
396: // Interface indexes (overlap mop values)
397: ILast = 1, // Use last marshalled interface
398: IUnk, // IUnknown
399: IMnk, // IMoniker
400: IStg, // IStorage
401:
402: IDObj, // IDataObject
403: IVObj, // IViewObject
404: IOleObj, // IOleObject
405: IIpObj, // IOleInPlaceObject
406:
407: ICSite, // IOleClientSite
408: IIpSite, // IOleInPlaceSite
409: IAdvSink, // IAdviseSink
410:
411: IPDName, // IParseDisplayName
412: IOleCont, // IOleContainer
413: IOleItemCont, // IOleItemContainer
414: IBCtx, // IBindCtx
415:
416: IEStatData, // IEnumSTATDATA
417: IEForEtc, // IEnumFORMATETC
418: IEStr, // IEnumString
419: IEVerbs, // IEnumOLEVERB
420: IEMnk, // IEnumMoniker
421:
422: IOleWnd, // IOleWIndow
423: IIpUiWnd, // IOleInPlaceUIWindow
424: IIpFrame, // IOleInPlaceFrame
425: IIpAObj, // IOleInPlaceActiveObject
426: IStStream, // IStream
427: IEUnk // IEnumUnknown
428: } MOP;
429: //
430: // Modifiers combine with other types to indicate pointer to the type:
431: // - MIn values are passed on call, but not updated upon return
432: // - MOut values are not passed on call, but are updated upon return
433: // - MIO values are passed on call, and updated upon return.
434: //
435: // M** indicates the argument is a pointer to the type. For types
436: // which imply pointer (lpStr, pBuf, IMnk) M** indicates pointer to a pointer
437: // (as in LPSTR FAR*, IEnumClipFormat FAR* FAR*). For MOut the value pointed
438: // (i.e. the interface pointer) is ignored. MIn, MIO not supported.
439: //
440: // Interface indexes follow IFace mop to specify type of interface being
441: // marshalled. ILast specify last IID marshalled.
442: //
443: // By convention the return value is always an HRESULT.
444: //
445: // MOP is an 8-bit value; it fits in a BYTE. Example:
446: //
447: // static mopsSomeFunc[] { pBuf | MIn, uLong, IFace, IDObj, ..., NilMop };
448: //
449:
450:
451: // FNI describes how to marshal, unmarshal specific function
452: //
453: typedef int FNITYPE;
454:
455: #define FNITYPE_NilFni 0
456: #define FNITYPE_RevArg 0x01 // Arguments pushed left-to-right (pascal)
457: #define FNITYPE_Clean 0x02 // Callee cleans stack (pascal)
458: #define FNITYPE_Method 0x04 // Class method.
459: #define FNITYPE_Virtual 0x08 // Virtual function
460: #define FNITYPE_Send 0x10 // Use SendMessage (not PostMessage)
461: #define FNITYPE_NoWait 0x20 // Do not wait for reply (only when PostMessage)
462:
463: struct FAR FNI { // Static data for function marshalling
464: FNITYPE m_type; // Function description
465: struct { // For virtual function
466: const IID FAR* lpIID;// far pointer to Interface ID
467: int iMethod; // Method index
468: } m_loc; // ----
469: UINT m_cbStk; // Stack space for pushing all arguments
470: UINT m_cbStm; // Stream space for marshalling arguments
471: UINT m_cbExtStm; // Additional stream space for strings, buffers
472: BYTE FAR* m_args; // Arguments MOPs
473: };
474:
475: //
476: // Example
477: //
478: //static FNI fniSomeFunc = {
479: // FNITYPE_Method | FNITYPE_Virtual,
480: // { //interface and method Indices
481: // &_IID_ISomeIface,
482: // IFUNC_SomeFunc
483: // },
484: // 64, // Stack space
485: // 96, // Minimun Stream space
486: // 48, // Estimated extra stream space
487: // mopsSomeFunc // The mops
488: //};
489: //
490: // _IID_ISomeIface is the IID for the interface of this object,
491: // IIFACE_SomeFunc is the index of this method within the interface.
492: //
493:
494:
495: STDAPI LrpcCall(ILrpc FAR* pILrpc, FNI FAR* pfni, void FAR* pFirstArg);
496:
497: STDAPI LrpcDispatch(IStream FAR* pIStream, FNI FAR* pfni, void FAR* pObj);
498:
499: STDAPI_(BOOL) IsValidOID(OID oid);
500:
501: #endif // _OLEREM_H
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.