Annotation of mstools/ole20/h/olerem.h, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.