#ifndef __MS_UTIL_H__ #define __MS_UTIL_H__ extern "C" { #include "t120.h" } // // GUI message boxes kill us when we hit an assert or error, because they // have a message pump that causes messages to get dispatched, making it // very difficult for us to debug problems when they occur. Therefore // we redefine ERROR_OUT and ASSERT // #ifdef _DEBUG __inline void MyDebugBreak(void) { DebugBreak(); } #endif // _DEBUG /* * Macro used to force values to four byte boundaries. This macro will need to * be considered when portability issues arise. */ #define ROUNDTOBOUNDARY(num) (((UINT)(num) + 0x03) & 0xfffffffcL) // the following create a dword that will look like "abcd" in debugger #ifdef SHIP_BUILD #define MAKE_STAMP_ID(a,b,c,d) #else #define MAKE_STAMP_ID(a,b,c,d) MAKELONG(MAKEWORD(a,b),MAKEWORD(c,d)) #endif // SHIP_BUILD class CRefCount { public: #ifdef SHIP_BUILD CRefCount(void); #else CRefCount(DWORD dwStampID); #endif virtual ~CRefCount(void) = 0; LONG AddRef(void); LONG Release(void); void ReleaseNow(void); protected: LONG GetRefCount(void) { return m_cRefs; } BOOL IsRefCountZero(void) { return (0 == m_cRefs); } LONG Lock(void); LONG Unlock(BOOL fRelease = TRUE); LONG GetLockCount(void) { return m_cLocks; } BOOL IsLocked(void) { return (0 == m_cLocks); } private: #ifndef SHIP_BUILD DWORD m_dwStampID;// to remove before we ship it #endif LONG m_cRefs; // reference count LONG m_cLocks; // lock count of the essential contents }; extern HINSTANCE g_hDllInst; __inline void My_CloseHandle(HANDLE hdl) { if (NULL != hdl) { CloseHandle(hdl); } } #if defined(_DEBUG) LPSTR _My_strdupA(LPCSTR pszSrc, LPSTR pszFileName, UINT nLineNumber); LPWSTR _My_strdupW(LPCWSTR pszSrc, LPSTR pszFileName, UINT nLineNumber); LPWSTR _My_strdupW2(UINT cchSrc, LPCWSTR pszSrc, LPSTR pszFileName, UINT nLineNumber); LPOSTR _My_strdupO2(LPBYTE lpbSrc, UINT cOctets, LPSTR pszFileName, UINT nLineNumber); #define My_strdupA(pszSrc) _My_strdupA(pszSrc, __FILE__, __LINE__) #define My_strdupW(pszSrc) _My_strdupW(pszSrc, __FILE__, __LINE__) #define My_strdupW2(cchSrc,pszSrc) _My_strdupW2(cchSrc, pszSrc, __FILE__, __LINE__) #define My_strdupO2(lpbSrc,cOctets) _My_strdupO2(lpbSrc, cOctets, __FILE__, __LINE__) #define My_strdupO(poszSrc) _My_strdupO2(poszSrc->value, poszSrc->length, __FILE__, __LINE__) #else LPSTR My_strdupA(LPCSTR pszSrc); LPWSTR My_strdupW(LPCWSTR pszSrc); LPWSTR My_strdupW2(UINT cchSrc, LPCWSTR pszSrc); // backward compatible to UnicodeString LPOSTR My_strdupO2(LPBYTE lpbSrc, UINT cOctets); __inline LPOSTR My_strdupO(LPOSTR poszSrc) { return My_strdupO2(poszSrc->value, poszSrc->length); } #endif UINT My_strlenA(LPCSTR pszSrc); UINT My_strlenW(LPCWSTR pszSrc); int My_strcmpW(LPCWSTR pwsz1, LPCWSTR pwsz2); #ifdef _UNICODE #define My_strdup My_strdupW #define My_strlen My_strlenW #define My_strcmp My_strcmpW #else #define My_strdup My_strdupA #define My_strlen My_strlenA #define My_strcmp lstrcmpA #endif INT My_strcmpO(LPOSTR posz1, LPOSTR posz2); #endif // __MS_UTIL_H__