Annotation of mstools/ole20/h/olerem.h, revision 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.