|
|
1.1 ! root 1: /* ole2sp.h - semi-private info; only for test apps within the development group ! 2: */ ! 3: ! 4: #if !defined( _OLE2SP_H_ ) ! 5: #define _OLE2SP_H_ ! 6: ! 7: #include <shellapi.h> ! 8: ! 9: // For MAC, M_PROLOG and M_EPILOG are macros which assist us in setting up the A5 ! 10: // world for a DLL when a method in the DLL is called from outside the DLL. ! 11: ! 12: #ifdef _MAC ! 13: ! 14: #define _MAX_PATH 260 ! 15: ! 16: #ifdef __cplusplus ! 17: ! 18: class CSetA5 ! 19: { ! 20: public: ! 21: CSetA5 (ULONG savedA5){ A5save = SetA5(savedA5);} ! 22: ~CSetA5 (){ SetA5(A5save);} ! 23: ! 24: private: ! 25: ULONG A5save; ! 26: }; ! 27: ! 28: pascal long GetA5(void) = 0x2E8D; ! 29: ! 30: #define M_PROLOG(where) CSetA5 Dummy((where)->savedA5) ! 31: #define SET_A5 ULONG savedA5 ! 32: #define GET_A5() savedA5 = GetA5() ! 33: ! 34: // These macros assist Mac in manually saving/setting/restoring A5 in routines that contain ! 35: // goto's. ! 36: ! 37: #define A5_PROLOG(where) ULONG A5save = SetA5(where->savedA5) ! 38: #define RESTORE_A5() SetA5(A5save) ! 39: ! 40: // Lets MAC name our segments without ifdef's. ! 41: ! 42: #define NAME_SEG(x) ! 43: ! 44: #endif // ccplus ! 45: ! 46: #else ! 47: ! 48: #define M_PROLOG(where) ! 49: #define SET_A5 ! 50: #define GET_A5() ! 51: #define A5_PROLOG(where) ! 52: #define RESTORE_A5() ! 53: #define NAME_SEG(x) ! 54: ! 55: ! 56: #define IGetProcAddress(a,b) GetProcAddress((a),(b)) ! 57: ! 58: #endif ! 59: ! 60: ! 61: #define ReportResult(a,b,c,d) ResultFromScode(b) ! 62: ! 63: #ifdef OLE2SHIP ! 64: #ifdef WIN32 ! 65: #define MAP16(v16) ! 66: #define MAP32(v32) v32 ! 67: #define MAP1632(v16,v32) v32 ! 68: #else ! 69: #define MAP16(v16) v16 ! 70: #define MAP32(v32) ! 71: #define MAP1632(v16,v32) v16 ! 72: #endif ! 73: #endif ! 74: ! 75: /****** Misc defintions ***************************************************/ ! 76: ! 77: #ifdef __TURBOC__ ! 78: #define implement struct huge ! 79: #else ! 80: #define implement struct ! 81: #endif ! 82: #define ctor_dtor private ! 83: #define implementations private ! 84: #define shared_state private ! 85: ! 86: // helpers for internal methods and functions which follow the same convention ! 87: // as the external ones ! 88: ! 89: #ifdef __cplusplus ! 90: #define INTERNALAPI_(type) extern "C" type ! 91: #else ! 92: #define INTERNALAPI_(type) type ! 93: #endif ! 94: ! 95: #define INTERNAL HRESULT ! 96: #define INTERNAL_(type) type ! 97: #define FARINTERNAL HRESULT FAR ! 98: #define FARINTERNAL_(type) type FAR ! 99: #define NEARINTERNAL HRESULT NEAR ! 100: #define NEARINTERNAL_(type) type NEAR ! 101: ! 102: ! 103: ! 104: //BEGIN REVIEW: We may not need all the following ones ! 105: ! 106: #define OT_LINK 1L ! 107: #define OT_EMBEDDED 2L ! 108: #define OT_STATIC 3L ! 109: ! 110: ! 111: //END REVIEW ..... ! 112: ! 113: ! 114: /****** Old Error Codes ************************************************/ ! 115: ! 116: #define S_OOM E_OUTOFMEMORY ! 117: #define S_BADARG E_INVALIDARG ! 118: #define S_BLANK E_BLANK ! 119: #define S_FORMAT E_FORMAT ! 120: #define S_NOT_RUNNING E_NOTRUNNING ! 121: #define E_UNSPEC E_FAIL ! 122: ! 123: ! 124: /****** Macros for nested clases ******************************************/ ! 125: ! 126: /* To overcome problems with nested classes on MAC ! 127: * ! 128: * NC(a,b) is used to define a member function of a nested class: ! 129: * ! 130: * STDMETHODIMP_(type) NC(ClassName,NestedClassName)::MemberFunction(...) ! 131: * ! 132: * DECLARE_NC(a,b) is used within a class declaration to let a nested class ! 133: * access it container class: ! 134: * ! 135: * class ClassName { ! 136: * .............. ! 137: * ! 138: * class NestedClassName { ! 139: * ............. ! 140: * }; ! 141: * DECLARE_NC(ClassName,NestedClassName) ! 142: * .............. ! 143: * }; ! 144: */ ! 145: ! 146: #ifdef _MAC ! 147: ! 148: #define NESTED_CLASS(a,b) struct a##_##b ! 149: #define NC(a,b) a##__##b ! 150: #define NC1(a,b) a##_##b ! 151: #define DECLARE_NC(a,b) typedef a##::##b a##__##b; friend a##__##b; ! 152: #define DECLARE_NC2(a,b) typedef a##::a##_##b a##__##b; friend a##__##b; ! 153: ! 154: #else ! 155: ! 156: #define NC(a,b) a##::##b ! 157: #define DECLARE_NC(a,b) friend b; ! 158: ! 159: #endif ! 160: ! 161: ! 162: /****** More Misc defintions **********************************************/ ! 163: ! 164: ! 165: // LPLPVOID should not be made a typedef. typedef won't compile; worse ! 166: // within complicated macros the compiler generates unclear error messages ! 167: // ! 168: #define LPLPVOID void FAR * FAR * ! 169: ! 170: #define UNREFERENCED(a) ((void)(a)) ! 171: ! 172: #ifndef BASED_CODE ! 173: #ifdef WIN32 ! 174: #define BASED_CODE ! 175: #else ! 176: #define BASED_CODE __based(__segname("_CODE")) ! 177: #endif ! 178: #endif ! 179: ! 180: ! 181: /****** Standard IUnknown Implementation **********************************/ ! 182: ! 183: /* ! 184: * The following macro declares a nested class CUnknownImpl, ! 185: * creates an object of that class in the outer class, and ! 186: * declares CUnknownImpl to be a friend of the outer class. After ! 187: * writing about 20 class headers, it became evident that the ! 188: * implementation of CUnknownImpl was very similar in all cases, ! 189: * and this macro captures the similarity. The classname ! 190: * parameter is the name of the outer class WITHOUT the leading ! 191: * "C"; i.e., for CFileMoniker, classname is FileMoniker. ! 192: */ ! 193: ! 194: #define noError return NOERROR ! 195: ! 196: #ifdef _MAC ! 197: ! 198: #define STDUNKDECL(cclassname,classname) NESTED_CLASS(cclassname, CUnknownImpl):IUnknown { public: \ ! 199: NC1(cclassname,CUnknownImpl)( cclassname FAR * p##classname ) { m_p##classname = p##classname;} \ ! 200: STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPLPVOID ppvObj); \ ! 201: STDMETHOD_(ULONG,AddRef)(THIS); \ ! 202: STDMETHOD_(ULONG,Release)(THIS); \ ! 203: private: cclassname FAR* m_p##classname; }; \ ! 204: DECLARE_NC2(cclassname, CUnknownImpl) \ ! 205: NC(cclassname, CUnknownImpl) m_Unknown; ! 206: ! 207: #else // _MAC ! 208: ! 209: #define STDUNKDECL( ignore, classname ) implement CUnknownImpl:IUnknown { public: \ ! 210: CUnknownImpl( C##classname FAR * p##classname ) { m_p##classname = p##classname;} \ ! 211: STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPLPVOID ppvObj); \ ! 212: STDMETHOD_(ULONG,AddRef)(THIS); \ ! 213: STDMETHOD_(ULONG,Release)(THIS); \ ! 214: private: C##classname FAR* m_p##classname; }; \ ! 215: DECLARE_NC(C##classname, CUnknownImpl) \ ! 216: CUnknownImpl m_Unknown; ! 217: #endif ! 218: ! 219: /* ! 220: * The following macro implements all the methods of a nested ! 221: * CUnknownImpl class EXCEPT FOR QUERYINTERFACE. This macro was ! 222: * written after about 20 classes were written in which the ! 223: * implementations of CUnknownImpl were all the same. ! 224: */ ! 225: ! 226: #define STDUNKIMPL(classname) \ ! 227: STDMETHODIMP_(ULONG) NC(C##classname,CUnknownImpl)::AddRef( void ){ \ ! 228: return ++m_p##classname->m_refs; } \ ! 229: STDMETHODIMP_(ULONG) NC(C##classname,CUnknownImpl)::Release( void ){ \ ! 230: if (--m_p##classname->m_refs == 0) { delete m_p##classname; return 0; } \ ! 231: return m_p##classname->m_refs;} ! 232: ! 233: ! 234: /* ! 235: * The following macro implements class::CUnknownImpl::QueryInterface IN ! 236: * THE SPECIAL CASE IN WHICH THE OUTER CLASS PRESENTS ONLY ONE INTERFACE ! 237: * OTHER THAN IUNKNOWN AND IDEBUG. This is not universally the case, ! 238: * but it is common enough that this macro will save time and space. ! 239: */ ! 240: ! 241: #ifdef _DEBUG ! 242: #define STDDEB_QI(classname) \ ! 243: if (iidInterface == IID_IDebug) {*ppv = (void FAR *)&(m_p##classname->m_Debug); return 0;} else ! 244: #else ! 245: #define STDDEB_QI(classname) ! 246: #endif ! 247: ! 248: #define STDUNK_QI_IMPL(classname, interfacename) \ ! 249: STDMETHODIMP NC(C##classname,CUnknownImpl)::QueryInterface \ ! 250: (REFIID iidInterface, void FAR * FAR * ppv) { \ ! 251: if (iidInterface == IID_IUnknown) {\ ! 252: *ppv = (void FAR *)&m_p##classname->m_Unknown;\ ! 253: AddRef(); noError;\ ! 254: } else if (iidInterface == IID_I##interfacename) { \ ! 255: *ppv = (void FAR *) &(m_p##classname->m_##classname); \ ! 256: m_p##classname->m_pUnkOuter->AddRef(); return NOERROR; \ ! 257: } else \ ! 258: STDDEB_QI(classname) \ ! 259: {*ppv = NULL; return ResultFromScode(E_NOINTERFACE);} \ ! 260: } ! 261: ! 262: ! 263: /* ! 264: * The following macro implements the IUnknown methods inherited ! 265: * by the implementation of another interface. The implementation ! 266: * is simply to delegate all calls to m_pUnkOuter. Parameters: ! 267: * ocname is the outer class name, icname is the implementation ! 268: * class name. ! 269: * ! 270: */ ! 271: ! 272: #define STDUNKIMPL_FORDERIVED(ocname, icname) \ ! 273: STDMETHODIMP NC(C##ocname,C##icname)::QueryInterface \ ! 274: (REFIID iidInterface, LPLPVOID ppvObj) { \ ! 275: return m_p##ocname->m_pUnkOuter->QueryInterface(iidInterface, ppvObj);} \ ! 276: STDMETHODIMP_(ULONG) NC(C##ocname,C##icname)::AddRef(void) { \ ! 277: return m_p##ocname->m_pUnkOuter->AddRef(); } \ ! 278: STDMETHODIMP_(ULONG) NC(C##ocname,C##icname)::Release(void) { \ ! 279: return m_p##ocname->m_pUnkOuter->Release(); } ! 280: ! 281: ! 282: /****** Debug defintions **************************************************/ ! 283: ! 284: #include <debug.h> ! 285: ! 286: ! 287: /****** Other API defintions **********************************************/ ! 288: ! 289: // Utility function not in the spec; in ole2.dll. ! 290: // Read and write length-prefixed strings. Open/Create stream. ! 291: // ReadStringStream does allocation, returns length of ! 292: // required buffer (strlen + 1 for terminating null) ! 293: ! 294: STDAPI ReadStringStream( LPSTREAM pstm, LPSTR FAR * ppsz ); ! 295: STDAPI WriteStringStream( LPSTREAM pstm, LPCSTR psz ); ! 296: STDAPI OpenOrCreateStream( IStorage FAR * pstg, const char FAR * pwcsName, ! 297: IStream FAR* FAR* ppstm); ! 298: ! 299: ! 300: // read and write ole control stream (in ole2.dll) ! 301: STDAPI WriteOleStg (LPSTORAGE pstg, IOleObject FAR* pOleObj, ! 302: CLIPFORMAT cfFormat, LPSTREAM FAR* ppstmOut); ! 303: STDAPI ReadOleStg (LPSTORAGE pstg, DWORD FAR* pdwFlags, ! 304: DWORD FAR* pdwOptUpdate, CLIPFORMAT FAR* pcfFormat, ! 305: LPMONIKER FAR* ppmk, LPSTREAM FAR* pstmOut); ! 306: STDAPI ReadM1ClassStm(LPSTREAM pStm, CLSID FAR* pclsid); ! 307: STDAPI WriteM1ClassStm(LPSTREAM pStm, REFCLSID rclsid); ! 308: ! 309: ! 310: // low level reg.dat access (in compobj.dll) ! 311: STDAPI CoGetInProcDll(REFCLSID rclsid, BOOL fServer, LPSTR lpszDll, int cbMax); ! 312: STDAPI CoGetLocalExe(REFCLSID rclsid, LPSTR lpszExe, int cbMax); ! 313: STDAPI CoGetClassExt(LPCSTR lpszExt, LPCLSID pclsid); ! 314: STDAPI CoGetPSClsid(REFIID iid, LPCLSID lpclsid); ! 315: ! 316: ! 317: // simpler alternatives to public apis ! 318: STDAPI_(int) StringFromGUID2(REFGUID rguid, LPSTR lpsz, int cbMax); ! 319: #define StringFromCLSID2(rclsid, lpsz, cbMax) \ ! 320: StringFromGUID2(rclsid, lpsz, cbMax) ! 321: ! 322: #define StringFromIID2(riid, lpsz, cbMax) \ ! 323: StringFromGUID2(riid, lpsz, cbMax) ! 324: ! 325: STDAPI_(int) Ole1ClassFromCLSID2(REFCLSID rclsid, LPSTR lpsz, int cbMax); ! 326: STDAPI_(BOOL) GUIDFromString(LPCSTR lpsz, LPGUID pguid); ! 327: STDAPI CLSIDFromOle1Class(LPCSTR lpsz, LPCLSID lpclsid); ! 328: STDAPI CoOpenClassKey(REFCLSID clsid, HKEY FAR* lphkeyClsid); ! 329: ! 330: INTERNAL CreateStandardMalloc(DWORD memctx, IMalloc FAR* FAR* ppMalloc); ! 331: // were public; now not ! 332: STDAPI SetDocumentBitStg(LPSTORAGE pStg, BOOL fDocument); ! 333: STDAPI GetDocumentBitStg(LPSTORAGE pStg); ! 334: ! 335: ! 336: //*************************************************************************** ! 337: //* Object synchronization stuff ! 338: //*************************************************************************** ! 339: ! 340: typedef DWORD COCS[4]; ! 341: typedef COCS FAR* LPCOCS; ! 342: ! 343: typedef struct _TABLELOCK { ! 344: COCS cocs; ! 345: DWORD dwCount; ! 346: } TABLELOCK, FAR* LPTABLELOCK; ! 347: ! 348: #ifdef WIN32 ! 349: ! 350: EXTERN_C void WINAPI CoInitializeCriticalSection(LPCOCS pcs); ! 351: EXTERN_C void WINAPI CoEnterCriticalSection(LPCOCS pcs); ! 352: EXTERN_C void WINAPI CoLeaveCriticalSection(LPCOCS pcs); ! 353: EXTERN_C void WINAPI CoDeleteCriticalSection(LPCOCS pcs); ! 354: ! 355: EXTERN_C void WINAPI _LockTable( LPTABLELOCK ptl, BOOL fWrite, DWORD * pdw ); ! 356: EXTERN_C BOOL WINAPI _UnlockTable( LPTABLELOCK ptl, BOOL fWrite, DWORD * pdw ); ! 357: ! 358: #define LockTable(pTableLock,fWrite) \ ! 359: TableLockRetry:\ ! 360: DWORD dwTableLockRetry;\ ! 361: _LockTable(pTableLock,fWrite,&dwTableLockRetry); ! 362: ! 363: ! 364: #define UnlockTable(pTableLock,fWrite) \ ! 365: if ( _UnlockTable(pTableLock, fWrite, &dwTableLockRetry) ) \ ! 366: goto TableLockRetry; ! 367: ! 368: #define InitializeTableLock(pTableLock) \ ! 369: (CoInitializeCriticalSection(&pTableLock->cocs),pTableLock->dwCount=0) ! 370: ! 371: #define DeleteTableLock(pTableLock) \ ! 372: (CoDeleteCriticalSection(&pTableLock->cocs),pTableLock->dwCount=0) ! 373: ! 374: ! 375: EXTERN_C DWORD GetSyncTimeout(void); ! 376: ! 377: #else ! 378: ! 379: #define CoInitializeCriticalSection(pcs) ! 380: #define CoEnterCriticalSection(pcs) ! 381: #define CoLeaveCriticalSection(pcs) ! 382: #define CoDeleteCriticalSection(pcs) ! 383: ! 384: #define LockTable(pTableLock,fWrite) ! 385: #define UnlockTable(pTableLock,fWrite) ! 386: #define InitializeTableLock(pTableLock) ! 387: #define DeleteTableLock(pTableLock) ! 388: ! 389: #define GetSyncTimeout() ((DWORD) 60000L) ! 390: ! 391: #endif ! 392: ! 393: /* ! 394: * Shared memory allocation routines ! 395: */ ! 396: STDAPI_(void FAR*) SharedMemAlloc(ULONG size, DWORD id); ! 397: STDAPI_(void FAR*) SharedMemReAlloc(void FAR* pmem, ULONG newsize, DWORD id); ! 398: STDAPI_(void) SharedMemFree(void FAR* pmem, DWORD id); ! 399: STDAPI_(DWORD) SharedMemSize(void FAR* pmem, DWORD id); ! 400: STDAPI_(int) MemType(void FAR* pv); ! 401: ! 402: #ifdef WIN32 ! 403: EXTERN_C DWORD GetCallTimeout(void); ! 404: #else ! 405: #define GetCallTimeout() ((DWORD) 5000L) ! 406: #endif ! 407: ! 408: ! 409: /* ! 410: * Some docfiles stuff ! 411: */ ! 412: ! 413: #define STGM_DFRALL (STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_DENY_WRITE) ! 414: #define STGM_DFALL (STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE) ! 415: #define STGM_SALL (STGM_READWRITE | STGM_SHARE_EXCLUSIVE) ! 416: ! 417: ! 418: #endif // _OLE2SP_H_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.