310 lines
6.8 KiB
C
310 lines
6.8 KiB
C
|
/*
|
||
|
* _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__
|