summaryrefslogtreecommitdiffstats
path: root/private/ole32/ih/ole2sp.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/ole32/ih/ole2sp.h')
-rw-r--r--private/ole32/ih/ole2sp.h411
1 files changed, 411 insertions, 0 deletions
diff --git a/private/ole32/ih/ole2sp.h b/private/ole32/ih/ole2sp.h
new file mode 100644
index 000000000..89d38f858
--- /dev/null
+++ b/private/ole32/ih/ole2sp.h
@@ -0,0 +1,411 @@
+/* ole2sp.h - semi-private info; only for test apps within the development group
+*/
+
+#if !defined( _OLE2SP_H_ )
+#define _OLE2SP_H_
+
+#include <shellapi.h>
+
+// For MAC, M_PROLOG and M_EPILOG are macros which assist us in setting up the A5
+// world for a DLL when a method in the DLL is called from outside the DLL.
+
+#ifdef _MAC
+
+#define _MAX_PATH 260
+
+#ifdef __cplusplus
+
+class CSetA5
+{
+public:
+ CSetA5 (ULONG savedA5){ A5save = SetA5(savedA5);}
+ ~CSetA5 (){ SetA5(A5save);}
+
+private:
+ ULONG A5save;
+};
+
+pascal long GetA5(void) = 0x2E8D;
+
+#define M_PROLOG(where) CSetA5 Dummy((where)->savedA5)
+#define SET_A5 ULONG savedA5
+#define GET_A5() savedA5 = GetA5()
+
+// These macros assist Mac in manually saving/setting/restoring A5 in routines that contain
+// goto's.
+
+#define A5_PROLOG(where) ULONG A5save = SetA5(where->savedA5)
+#define RESTORE_A5() SetA5(A5save)
+
+// Lets MAC name our segments without ifdef's.
+
+#define NAME_SEG(x)
+
+#endif // ccplus
+
+#else
+
+#define M_PROLOG(where)
+#define SET_A5
+#define GET_A5()
+#define A5_PROLOG(where)
+#define RESTORE_A5()
+#define NAME_SEG(x)
+
+//
+// By defining SEG(x) to code_seg(), we make #pragma SEG(x) a nop and
+// eliminate lots of unknown pragma warnings... 02/18/94
+//
+
+#define SEG(x) code_seg()
+
+#define IGetProcAddress(a,b) GetProcAddress((a),(b))
+
+#endif
+
+
+#define ReportResult(a,b,c,d) ResultFromScode(b)
+
+
+#ifdef WIN32
+#define MAP16(v16)
+#define MAP32(v32) v32
+#define MAP1632(v16,v32) v32
+#else
+#define MAP16(v16) v16
+#define MAP32(v32)
+#define MAP1632(v16,v32) v16
+#endif
+
+
+/****** Misc defintions ***************************************************/
+
+#ifdef __TURBOC__
+#define implement struct huge
+#else
+#define implement struct
+#endif
+#define ctor_dtor private
+#define implementations private
+#define shared_state private
+
+// helpers for internal methods and functions which follow the same convention
+// as the external ones
+
+#ifdef __cplusplus
+#define INTERNALAPI_(type) extern "C" type
+#else
+#define INTERNALAPI_(type) type
+#endif
+
+#define INTERNAL HRESULT
+#define INTERNAL_(type) type
+#define FARINTERNAL HRESULT FAR
+#define FARINTERNAL_(type) type FAR
+#define NEARINTERNAL HRESULT NEAR
+#define NEARINTERNAL_(type) type NEAR
+
+
+
+//BEGIN REVIEW: We may not need all the following ones
+
+#define OT_LINK 1L
+#define OT_EMBEDDED 2L
+#define OT_STATIC 3L
+
+
+//END REVIEW .....
+
+
+/****** Old Error Codes ************************************************/
+
+#define S_OOM E_OUTOFMEMORY
+#define S_BADARG E_INVALIDARG
+#define S_BLANK E_BLANK
+#define S_FORMAT E_FORMAT
+#define S_NOT_RUNNING E_NOTRUNNING
+#define E_UNSPEC E_FAIL
+
+
+
+/****** Macros for nested clases ******************************************/
+
+/* To overcome problems with nested classes on MAC
+ *
+ * NC(a,b) is used to define a member function of a nested class:
+ *
+ * STDMETHODIMP_(type) NC(ClassName,NestedClassName)::MemberFunction(...)
+ *
+ * DECLARE_NC(a,b) is used within a class declaration to let a nested class
+ * access it container class:
+ *
+ * class ClassName {
+ * ..............
+ *
+ * class NestedClassName {
+ * .............
+ * };
+ * DECLARE_NC(ClassName,NestedClassName)
+ * ..............
+ * };
+ */
+
+#ifdef _MAC
+
+#define NESTED_CLASS(a,b) struct a##_##b
+#define NC(a,b) a##__##b
+#define NC1(a,b) a##_##b
+#define DECLARE_NC(a,b) typedef a##::##b a##__##b; friend a##__##b;
+#define DECLARE_NC2(a,b) typedef a##::a##_##b a##__##b; friend a##__##b;
+
+#else
+
+#define NC(a,b) a##::##b
+#define DECLARE_NC(a,b) friend b;
+
+#endif
+
+
+/****** More Misc defintions **********************************************/
+
+
+// LPLPVOID should not be made a typedef. typedef won't compile; worse
+// within complicated macros the compiler generates unclear error messages
+//
+#define LPLPVOID void FAR * FAR *
+
+#define UNREFERENCED(a) ((void)(a))
+
+#ifndef BASED_CODE
+#ifdef WIN32
+#define BASED_CODE
+#else
+#define BASED_CODE __based(__segname("_CODE"))
+#endif
+#endif
+
+
+/****** Standard IUnknown Implementation **********************************/
+
+/*
+ * The following macro declares a nested class CUnknownImpl,
+ * creates an object of that class in the outer class, and
+ * declares CUnknownImpl to be a friend of the outer class. After
+ * writing about 20 class headers, it became evident that the
+ * implementation of CUnknownImpl was very similar in all cases,
+ * and this macro captures the similarity. The classname
+ * parameter is the name of the outer class WITHOUT the leading
+ * "C"; i.e., for CFileMoniker, classname is FileMoniker.
+ */
+
+#define noError return NOERROR
+
+#ifdef _MAC
+
+#define STDUNKDECL(cclassname,classname) NESTED_CLASS(cclassname, CUnknownImpl):IUnknown { public: \
+ NC1(cclassname,CUnknownImpl)( cclassname FAR * p##classname ) { m_p##classname = p##classname;} \
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPLPVOID ppvObj); \
+ STDMETHOD_(ULONG,AddRef)(THIS); \
+ STDMETHOD_(ULONG,Release)(THIS); \
+ private: cclassname FAR* m_p##classname; }; \
+ DECLARE_NC2(cclassname, CUnknownImpl) \
+ NC(cclassname, CUnknownImpl) m_Unknown;
+
+#else // _MAC
+
+#define STDUNKDECL( ignore, classname ) implement CUnknownImpl:IUnknown { public: \
+ CUnknownImpl( C##classname FAR * p##classname ) { m_p##classname = p##classname;} \
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPLPVOID ppvObj); \
+ STDMETHOD_(ULONG,AddRef)(THIS); \
+ STDMETHOD_(ULONG,Release)(THIS); \
+ private: C##classname FAR* m_p##classname; }; \
+ DECLARE_NC(C##classname, CUnknownImpl) \
+ CUnknownImpl m_Unknown;
+#endif
+
+/*
+ * The following macro implements all the methods of a nested
+ * CUnknownImpl class EXCEPT FOR QUERYINTERFACE. This macro was
+ * written after about 20 classes were written in which the
+ * implementations of CUnknownImpl were all the same.
+ */
+
+#ifdef WIN32
+
+#define STDUNKIMPL(classname) \
+STDMETHODIMP_(ULONG) NC(C##classname,CUnknownImpl)::AddRef( void ) \
+{ \
+ InterlockedIncrement((LONG *)&m_p##classname->m_refs); \
+ \
+ return m_p##classname->m_refs; \
+} \
+ \
+STDMETHODIMP_(ULONG) NC(C##classname,CUnknownImpl)::Release( void ) \
+{ \
+ ULONG culRefs = 0; \
+ \
+ culRefs = InterlockedDecrement((LONG *)&m_p##classname->m_refs); \
+ \
+ if (culRefs == 0) \
+ { \
+ delete m_p##classname; \
+ } \
+ \
+ return culRefs; \
+}
+
+#else
+
+#define STDUNKIMPL(classname) \
+STDMETHODIMP_(ULONG) NC(C##classname,CUnknownImpl)::AddRef( void ){ \
+ return ++m_p##classname->m_refs; } \
+STDMETHODIMP_(ULONG) NC(C##classname,CUnknownImpl)::Release( void ){ \
+ if (--m_p##classname->m_refs == 0) { delete m_p##classname; return 0; } \
+ return m_p##classname->m_refs;}
+
+#endif // WIN32
+
+
+/*
+ * The following macro implements class::CUnknownImpl::QueryInterface IN
+ * THE SPECIAL CASE IN WHICH THE OUTER CLASS PRESENTS ONLY ONE INTERFACE
+ * OTHER THAN IUNKNOWN AND IDEBUG. This is not universally the case,
+ * but it is common enough that this macro will save time and space.
+ */
+
+#ifdef _DEBUG
+#define STDDEB_QI(classname) \
+ if (IsEqualGUID(iidInterface, IID_IDebug)) \
+ {*ppv = (void FAR *)&(m_p##classname->m_Debug); return 0;} else
+#else
+#define STDDEB_QI(classname)
+#endif
+
+#ifdef WIN32
+
+#define STDUNK_QI_IMPL(classname, interfacename) \
+STDMETHODIMP NC(C##classname,CUnknownImpl)::QueryInterface \
+ (REFIID iidInterface, void FAR * FAR * ppv) \
+{ \
+ HRESULT hres = S_OK; \
+ \
+ if (IsEqualIID(iidInterface,IID_IUnknown)) \
+ { \
+ *ppv = (void FAR *)&m_p##classname->m_Unknown; \
+ AddRef(); \
+ } \
+ else if (IsEqualIID(iidInterface,IID_I##interfacename)) \
+ { \
+ *ppv = (void FAR *) &(m_p##classname->m_##classname); \
+ m_p##classname->m_pUnkOuter->AddRef(); \
+ } \
+ else STDDEB_QI(classname) \
+ { \
+ *ppv = NULL; \
+ hres = ResultFromScode(E_NOINTERFACE); \
+ } \
+ \
+ return hres; \
+}
+
+#else
+
+STDMETHODIMP NC(C##classname,CUnknownImpl)::QueryInterface \
+ (REFIID iidInterface, void FAR * FAR * ppv) { \
+ if (IsEqualGUID(iidInterface,IID_IUnknown)) {\
+ *ppv = (void FAR *)&m_p##classname->m_Unknown;\
+ AddRef(); noError;\
+ } else if (IsEqualGUID(iidInterface, IID_I##interfacename)) { \
+ *ppv = (void FAR *) &(m_p##classname->m_##classname); \
+ m_p##classname->m_pUnkOuter->AddRef(); return NOERROR; \
+ } else \
+ STDDEB_QI(classname) \
+ {*ppv = NULL; return ResultFromScode(E_NOINTERFACE);} \
+}
+#endif
+
+
+/*
+ * The following macro implements the IUnknown methods inherited
+ * by the implementation of another interface. The implementation
+ * is simply to delegate all calls to m_pUnkOuter. Parameters:
+ * ocname is the outer class name, icname is the implementation
+ * class name.
+ *
+ */
+
+#define STDUNKIMPL_FORDERIVED(ocname, icname) \
+ STDMETHODIMP NC(C##ocname,C##icname)::QueryInterface \
+(REFIID iidInterface, LPLPVOID ppvObj) { \
+ return m_p##ocname->m_pUnkOuter->QueryInterface(iidInterface, ppvObj);} \
+ STDMETHODIMP_(ULONG) NC(C##ocname,C##icname)::AddRef(void) { \
+ return m_p##ocname->m_pUnkOuter->AddRef(); } \
+ STDMETHODIMP_(ULONG) NC(C##ocname,C##icname)::Release(void) { \
+ return m_p##ocname->m_pUnkOuter->Release(); }
+
+
+/****** Debug defintions **************************************************/
+
+#include <debug.h>
+
+
+/****** Other API defintions **********************************************/
+
+// low level reg.dat access (in compobj.dll)
+STDAPI CoGetInProcDll(REFCLSID rclsid, BOOL fServer, LPOLESTR lpszDll, int cbMax);
+STDAPI CoGetLocalExe(REFCLSID rclsid, LPOLESTR lpszExe, int cbMax);
+STDAPI CoGetPSClsid(REFIID iid, LPCLSID lpclsid);
+
+
+// simpler alternatives to public apis
+// WINOLEAPI_(int) StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cbMax);
+#define StringFromCLSID2(rclsid, lpsz, cbMax) \
+ StringFromGUID2(rclsid, lpsz, cbMax)
+
+#define StringFromIID2(riid, lpsz, cbMax) \
+ StringFromGUID2(riid, lpsz, cbMax)
+
+STDAPI_(int) Ole1ClassFromCLSID2(REFCLSID rclsid, LPOLESTR lpsz, int cbMax);
+STDAPI_(BOOL) GUIDFromString(LPCOLESTR lpsz, LPGUID pguid);
+STDAPI CLSIDFromOle1Class(LPCOLESTR lpsz, LPCLSID lpclsid, BOOL fForceAssign=FALSE);
+STDAPI_(BOOL) CoIsHashedOle1Class(REFCLSID rclsid);
+STDAPI CoOpenClassKey(REFCLSID clsid, HKEY FAR* lphkeyClsid);
+
+
+// were public; now not
+STDAPI SetDocumentBitStg(LPSTORAGE pStg, BOOL fDocument);
+STDAPI GetDocumentBitStg(LPSTORAGE pStg);
+
+
+INTERNAL CreateStandardMalloc(DWORD memctx, IMalloc FAR* FAR* ppMalloc);
+
+
+/*
+ * Some docfiles stuff
+ */
+
+#define STGM_DFRALL (STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_DENY_WRITE)
+#define STGM_DFALL (STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE)
+#define STGM_SALL (STGM_READWRITE | STGM_SHARE_EXCLUSIVE)
+
+
+/*
+ * Some moniker stuff
+ */
+//REVIEW32: Should this get exported publicly??
+
+STDAPI Concatenate(LPMONIKER pmkFirst, LPMONIKER pmkRest,
+ LPMONIKER FAR * ppmkComposite );
+
+/*
+ * Drag and Drop Interface Property Name
+ */
+#define OLE_DROP_TARGET_PROP L"OleDropTargetInterface"
+#define OLE_DROP_TARGET_PROPA "OleDropTargetInterface"
+
+/*
+ * Private Clipboard Window IDataObject property name
+ */
+#define CLIPBOARD_DATA_OBJECT_PROP L"ClipboardDataObjectInterface"
+
+#endif // _OLE2SP_H_