//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 1996. // // File: iroleutl.h // // Contents: Definitions of utility stuff for use with Compound Document // objects. // // Classes: // CStaticClassFactory // CDynamicClassFactory // // Functions: // // Macros: // // History: 26-Feb-96 SSanu adapted from Forms stuff //---------------------------------------------------------------------------- #ifndef _IROLEUTL_HXX_ #define _IROLEUTL_HXX_ //--------------------------------------------------------------- // SCODE and HRESULT macros //--------------------------------------------------------------- #define OK(r) (SUCCEEDED(r)) #define NOTOK(r) (FAILED(r)) // {9AAB0270-7181-11cf-BE7A-00AA00577DD6} DEFINE_GUID(CLSID_IndexNotify, 0x9aab0270, 0x7181, 0x11cf, 0xbe, 0x7a, 0x0, 0xaa, 0x0, 0x57, 0x7d, 0xd6); // // {991adb50-b7f1-11cf-86e3-00aa00b4e1b8} DEFINE_GUID(CLSID_DSSNotify, 0x991adb50, 0xb7f1, 0x11cf, 0x86, 0xe3, 0x0, 0xaa, 0x0, 0xb4, 0xe1, 0xb8); // STDAPI _DllRegisterServer(HINSTANCE hInst, LPSTR lpszProgId, REFCLSID clsid); STDAPI _DllUnregisterServer(LPSTR lpszProgID, REFCLSID clsid); //--------------------------------------------------------------- // IUnknown //--------------------------------------------------------------- #define IRIncrement(__ul) InterlockedIncrement((long *) &__ul) #define IRDecrement(__ul) InterlockedDecrement((long *) &__ul) #define DECLARE_IR_IUNKNOWN_METHODS \ STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); \ STDMETHOD_(ULONG, AddRef) (void); \ STDMETHOD_(ULONG, Release) (void); #define DECLARE_IR_APTTHREAD_IUNKNOWN \ STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); \ ULONG _ulRefs; \ STDMETHOD_(ULONG, AddRef) (void) \ { \ return ++_ulRefs; \ } \ STDMETHOD_(ULONG, Release) (void) \ { \ if (!--_ulRefs) \ { \ delete this; \ return 0; \ } \ return _ulRefs; \ } #define DECLARE_IR_STANDARD_IUNKNOWN(cls) \ STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); \ ULONG _ulRefs; \ STDMETHOD_(ULONG, AddRef) (void) \ { \ IRIncrement(_ulRefs); \ return _ulRefs; \ } \ STDMETHOD_(ULONG, Release) (void) \ { \ if (!IRDecrement(_ulRefs)) \ { \ IRIncrement(_ulRefs); \ delete this; \ return 0; \ } \ return _ulRefs; \ } //+--------------------------------------------------------------------- // // Miscellaneous useful OLE helper and debugging functions // //---------------------------------------------------------------------- #if DBG == 1 STDAPI CheckAndReturnResult( HRESULT hr, LPSTR lpstrFile, UINT line, int cSuccess, ...); STDAPI_(void) CheckResult(HRESULT hr, LPSTR lpstrFile, UINT line); STDAPI_(void) PrintIID(DWORD dwFlags, REFIID riid); STDAPI PrintHRESULT(DWORD dwFlags, HRESULT hr); #define SRETURN(hr) \ return CheckAndReturnResult((hr), __FILE__, __LINE__, -1) #define RRETURN(hr) \ return CheckAndReturnResult((hr), __FILE__, __LINE__, 0) #define RRETURN1(hr, s1) \ return CheckAndReturnResult((hr), __FILE__, __LINE__, 1, (s1)) #define RRETURN2(hr, s1, s2) \ return CheckAndReturnResult((hr), __FILE__, __LINE__, 2, (s1), (s2)) #define RRETURN3(hr, s1, s2, s3) \ return CheckAndReturnResult((hr), __FILE__, __LINE__, 3, (s1), (s2), (s3)) #define WARN_ERROR(hr) CheckResult((hr), __FILE__, __LINE__) #define TRETURN(hr) return PrintHRESULT(DEB_TRACE, (hr)) #define TRACEIID(iid) PrintIID(DEB_TRACE, iid) #define TRACEHRESULT(hr) PrintHRESULT(DEB_TRACE, (hr)) #else // DBG == 0 #define SRETURN(hr) return (hr) #define RRETURN(hr) return (hr) #define RRETURN1(hr, s1) return (hr) #define RRETURN2(hr, s1, s2) return (hr) #define RRETURN3(hr, s1, s2, s3) return (hr) #define WARN_ERROR(hr) #define TRETURN(hr) return (hr) #define TRACEIID(iid) #define TRACEHRESULT(hr) #endif // DBG //+--------------------------------------------------------------------- // // Interface wrapper for tracing method invocations // //---------------------------------------------------------------------- #if DBG == 1 LPVOID WatchInterface(REFIID riid, LPVOID pv, LPWSTR lpstr); #define WATCHINTERFACE(iid, p, lpstr) WatchInterface(iid, p, lpstr) #else // DBG == 0 #define WATCHINTERFACE(iid, p, lpstr) (p) #endif // DBG //+--------------------------------------------------------------------- // // Standard IClassFactory implementation // //---------------------------------------------------------------------- // // Functions to manipulate object count variable g_ulObjCount. This variable // is used in the implementation of DllCanUnloadNow. inline void INC_OBJECT_COUNT(void) { extern ULONG g_ulObjCount; IRIncrement(g_ulObjCount); } inline void DEC_OBJECT_COUNT(void) { extern ULONG g_ulObjCount; // ASSERT(g_ulObjCount > 0); IRDecrement(g_ulObjCount); } inline ULONG GET_OBJECT_COUNT(void) { extern ULONG g_ulObjCount; return g_ulObjCount; } //+--------------------------------------------------------------- // // Class: CStaticClassFactory // // Purpose: Standard implementation of a class factory object // // Notes: **************!!!!!!!!!!!!!!!!!************* // TAKE NOTE --- The implementation of Release on this // class does not perform a delete. This is so you can // make the class factory a global static variable. // Use the CDynamicClassFactory class below for an object // which is not global static data. // //--------------------------------------------------------------- class CStaticClassFactory: public IClassFactory { public: CStaticClassFactory(void) : _ulRefs(1) {}; // IUnknown methods DECLARE_IR_IUNKNOWN_METHODS; // IClassFactory methods STDMETHOD(LockServer) (BOOL fLock); // CreateInstance is left pure virtual. protected: ULONG _ulRefs; }; //+--------------------------------------------------------------------------- // // Class: CDynamicClassFactory (DYNCF) // // Purpose: Class factory which exists on the heap, and whose Release // method does the normal thing. // // Interface: DECLARE_IR_STANDARD_IUNKNOWN -- IUnknown methods // // LockServer -- Per IClassFactory. // CDynamicClassFactory -- ctor. // ~CDynamicClassFactory -- dtor. // //---------------------------------------------------------------------------- class CDynamicClassFactory: public IClassFactory { public: // IUnknown methods DECLARE_IR_STANDARD_IUNKNOWN(CDynamicClassFactory) // IClassFactory methods STDMETHOD(LockServer) (BOOL fLock); // CreateInstance is left pure virtual. protected: CDynamicClassFactory(void); virtual ~CDynamicClassFactory(void); }; #endif //__IROLEUTL_HXX_