|
|
/*
* _UTIL.H * * Purpose: * declarations for various useful utility functions * * Author: * alexgo (4/25/95) */
#ifndef __UTIL_H__
#define __UTIL_H__
HGLOBAL DuplicateHGlobal( HGLOBAL hglobal ); INT CountMatchingBits(const DWORD *a, const DWORD *b, INT total); HRESULT ObjectReadSiteFlags(REOBJECT * preobj);
//Default values for drag scrolling
//(that aren't already defined by windows).
#define DEFSCROLLMAXVEL 100 //Cursor velocity above which we will not
//drag scroll (units=.01 in/sec).
#define DEFSCROLLVAMOUNT 50 //Vert. scroll amount per interval (units=.01 in)
#define DEFSCROLLHAMOUNT 50 //Horz. scroll amount per interval (units=.01 in)
//Stuff from OLESTD samples
//Ole clipboard format defines.
#define CF_EMBEDSOURCE "Embed Source"
#define CF_EMBEDDEDOBJECT "Embedded Object"
#define CF_LINKSOURCE "Link Source"
#define CF_OBJECTDESCRIPTOR "Object Descriptor"
#define CF_FILENAME "FileName"
#define CF_OWNERLINK "OwnerLink"
HRESULT OleStdSwitchDisplayAspect( LPOLEOBJECT lpOleObj, LPDWORD lpdwCurAspect, DWORD dwNewAspect, HGLOBAL hMetaPict, BOOL fDeleteOldAspect, BOOL fSetupViewAdvise, LPADVISESINK lpAdviseSink, BOOL FAR * lpfMustUpdate); LPUNKNOWN OleStdQueryInterface( LPUNKNOWN lpUnk, REFIID riid);
void OleUIDrawShading(LPRECT lpRect, HDC hdc);
VOID OleSaveSiteFlags(LPSTORAGE pstg, DWORD dwFlags, DWORD dwUser, DWORD dvAspect);
INT AppendString( BYTE **, BYTE *, int *, int * );
/****************************************************************************/ /* Stabilization classes */ /* These are used to stabilize objects during re-entrant calls */ /****************************************************************************/
//+-------------------------------------------------------------------------
//
// Class: CSafeRefCount
//
// Purpose: A concrete class for objects like the default handler to
// inherit from. CSafeRefCount will keep track of reference
// counts, nesting counts, and zombie states, allowing objects
// to easily manage the liveness of their memory images.
//
// Interface:
//
// History: dd-mmm-yy Author Comment
// 01-Aug-94 alexgo author
//
//--------------------------------------------------------------------------
class CSafeRefCount { public: ULONG SafeAddRef(); ULONG SafeRelease(); ULONG IncrementNestCount(); ULONG DecrementNestCount(); BOOL IsZombie(); CSafeRefCount(); virtual ~CSafeRefCount();
protected: VOID Zombie();
private:
ULONG m_cRefs; ULONG m_cNest;
ULONG m_fInDelete :1; ULONG m_fForceZombie :1; };
//+-------------------------------------------------------------------------
//
// Class: CStabilize
//
// Purpose: An instance of this class should be allocated on the
// stack of every object method that makes an outgoing call.
// The contstructor takes a pointer to the object's base
// CSafeRefCount class.
//
// Interface:
//
// History: dd-mmm-yy Author Comment
// 01-Aug-94 alexgo author
//
// Notes: The constructor will increment the nest count of the
// object while the destructor will decrement it.
//
//--------------------------------------------------------------------------
class CStabilize { public: inline CStabilize( CSafeRefCount *pObjSafeRefCount ); inline ~CStabilize();
private: CSafeRefCount * m_pObjSafeRefCount; };
inline CStabilize::CStabilize( CSafeRefCount *pObjSafeRefCount ) { pObjSafeRefCount->IncrementNestCount(); m_pObjSafeRefCount = pObjSafeRefCount; }
inline CStabilize::~CStabilize() { m_pObjSafeRefCount->DecrementNestCount(); }
/*
* SafeReleaseAndNULL(IUnknown **ppUnk) * * Purpose: * Helper for getting stable pointers during destruction or other times * * Notes: * Not thread safe, must provide higher level synchronization. */
inline void SafeReleaseAndNULL(IUnknown **ppUnk) { if (*ppUnk != NULL) { IUnknown *pUnkSave = *ppUnk; *ppUnk = NULL; pUnkSave->Release(); } }
BOOL FIsIconMetafilePict(HGLOBAL hmfp); HANDLE OleStdGetMetafilePictFromOleObject( LPOLEOBJECT lpOleObj, DWORD dwDrawAspect, LPSIZEL lpSizelHim, DVTARGETDEVICE FAR* ptd); HGLOBAL OleGetObjectDescriptorDataFromOleObject( LPOLEOBJECT pObj, DWORD dwAspect, POINTL ptl, LPSIZEL pszl);
// Default size for stack buffer
#define MAX_STACK_BUF 256
/*
* CTempBuf * * @class A simple temporary buffer allocator class that will allocate * buffers on the stack up to MAX_STACK_BUF and then use the * heap thereafter. */ class CTempBuf { //@access Public Data
public: //@cmember Constructor
CTempBuf();
//@cmember Destructor
~CTempBuf();
//@cmember Get buffer of size cb
void * GetBuf(LONG cb);
//@access Private Data
private:
//@cmember Sets up initial state of object
void Init();
//@cmember Frees any buffers allocated from heap
void FreeBuf();
//@cmember Buffer on stack to use
char _chBuf[MAX_STACK_BUF];
//@cmember Pointer to buffer to use
void * _pv;
//@cmember Size of currently allocated buffer
LONG _cb; };
/*
* CTempBuf::CTempBuf * * @mfunc Initialize object * */ inline CTempBuf::CTempBuf() { Init(); }
/*
* CTempBuf::~CTempBuf * * @mfunc Free any resources attached to this object * */ inline CTempBuf::~CTempBuf() { FreeBuf(); }
/*
* CTempCharBuf * * @class A wrapper for the temporary buffer allocater that returns a buffer of * char's. * * @base private | CTempBuf */ class CTempWcharBuf : private CTempBuf { //@access Public Data
public:
//@cmember Get buffer of size cch wide characters
WCHAR * GetBuf(LONG cch); };
/*
* CTempBuf::GetBuf * * @mfunc Get a buffer of the requested size * * @rdesc Pointer to buffer or NULL if one could not be allocated * */ inline WCHAR *CTempWcharBuf::GetBuf( LONG cch) //@parm size of buffer needed in *characters*
{ return (WCHAR *) CTempBuf::GetBuf(cch * sizeof(WCHAR)); }
/*
* CTempCharBuf * * @class A wrapper for the temporary buffer allocater that returns a buffer of * char's. * * @base private | CTempBuf */ class CTempCharBuf : private CTempBuf { //@access Public Data
public:
//@cmember Get buffer of size cch characters
char * GetBuf(LONG cch); };
/*
* CTempBuf::GetBuf * * @mfunc Get a buffer of the requested size * * @rdesc Pointer to buffer or NULL if one could not be allocated * */ inline char *CTempCharBuf::GetBuf(LONG cch) { return (char *) CTempBuf::GetBuf(cch * sizeof(TCHAR)); }
// Author revision color table
extern const COLORREF rgcrRevisions[];
// Only fixed number of revision color so don't let the table overflow.
#define REVMASK 7
#endif // !__UTIL_H__
|