#ifndef __WMSSTD_H__ #define __WMSSTD_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include #include #include #include ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// GENERIC MACROS ////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #define MAX(a, b) (max((a), (b))) #define MIN(a, b) (min((a), (b))) #define MAKEULONGLONG(a, b) ((ULONGLONG)(((DWORD)(a)) | ((ULONGLONG)((DWORD)(b))) << 32)) #define MAKEUINT64(a, b) MAKEULONGLONG((a),(b)) #define MAKEQWORD(a, b) MAKEULONGLONG((a),(b)) #define LODWORD(l) ((DWORD)(l)) #define HIDWORD(l) ((DWORD)(((ULONGLONG)(l) >> 32) & 0xFFFFFFFF)) #if !defined(COUNTOF) // macro to obtain the storage size of an array. #define COUNTOF( x ) ( sizeof(x) / sizeof( (x)[0] ) ) #endif ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// WINSOCK MACROS ////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #define NTOHULL(ull) MAKEULONGLONG(ntohl(LODWORD((ull))), ntohl(HIDWORD((ull)))) #define HTONULL(ull) MAKEULONGLONG(htonl(LODWORD((ull))), htonl(HIDWORD((ull)))) ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////// TYPES /////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// typedef ULONGLONG QWORD; typedef QWORD *LPQWORD; #ifndef _WIN64 typedef ULONG ULONG_PTR; typedef LONG LONG_PTR; #endif // _WIN64 ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// COMMENT MACROS ////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #define PUBLIC #define PROTECTED #define PRIVATE #define STATIC #define VIRTUAL ///////////////////////////////////////////////////////////////////////////////////////// //////////////////////////// DEBUG/RETAIL MACROS //////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #if DBG #define Debug(s) s // Statement/declaration included only if DBG #define Retail(s) // Statement/declaration included only if !DBG #define DebugOrRetail(d, r) d // d if DBG; r if !DBG #else // !DBG #define Debug(s) // Statement/declaration included only if DBG #define Retail(s) s // Statement/declaration included only if !DBG #define DebugOrRetail(d, r) r // d if DBG; r if !DBG #endif // !DBG ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// STRING MACROS /////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #if UNICODE #define Unicode(s) (s) #define Ansi(s) #define UnicodeOrAnsi(u, a) (u) #define AnsiOrUnicode(a, u) (u) #else #define Unicode(s) #define Ansi(s) (s) #define UnicodeOrAnsi(u, a) (a) #define AnsiOrUnicode(a, u) (a) #endif #define WcharToAchar(a, w, l) \ WideCharToMultiByte( \ CP_ACP, \ 0, \ (w), \ -1, \ (a), \ (l), \ NULL, \ NULL \ ) #define AcharToWchar(w, a, l) \ MultiByteToWideChar( \ CP_ACP, \ 0, \ (a), \ -1, \ (w), \ (l) \ ) #define WcharToTchar(t, w, l) UnicodeOrAnsi(wcscpy((t), (w)), WcharToAchar((t), (w), (l))) #define WcharToTcharEx(t, w, l, p) UnicodeOrAnsi((p) = (w), (WcharToAchar((t), (w), (l)), (p) = (t))) #define TcharToWchar(w, t, l) UnicodeOrAnsi(wcscpy((w), (t)), AcharToWchar((w), (t), (l))) #define TcharToWcharEx(w, t, l, p) UnicodeOrAnsi((p) = (t), (AcharToWchar((w), (t), (l)), (p) = (w))) #define AcharToTchar(t, a, l) AnsiOrUnicode(strcpy((t), (a)), AcharToWchar((t), (a), (l))) #define AcharToTcharEx(t, a, l, p) AnsiOrUnicode((p) = (a), (AcharToWchar((t), (a), (l)), (p) = (t))) #define TcharToAchar(a, t, l) AnsiOrUnicode(strcpy((a), (t)), WcharToAchar((a), (t), (l))) #define TcharToAcharEx(a, t, l, p) AnsiOrUnicode((p) = (t), (WcharToAchar((a), (t), (l)), (p) = (a))) ///////////////////////////////////////////////////////////////////////////////////////// //////////////////////// REFCOUNT AND SAFE_* MACROS ///////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #ifdef INC_REF #undef INC_REF #endif #ifdef DEC_REF #undef DEC_REF #endif #ifdef SINGLE_THREADED #define INC_REF(u) (++u) #define DEC_REF(u) (--u) #else // !SINGLE_THREADED #define INC_REF(u) InterlockedIncrement((LONG*)&u) #define DEC_REF(u) InterlockedDecrement((LONG*)&u) #endif // SINGLE_THREADED #ifndef _REF_ASSERT #ifdef NO_DEBUG_SYNCHRO #define _REF_ASSERT(x) #else // !NO_DEBUG_SYNCHRO #ifdef USE_MFC #define _REF_ASSERT(x) ASSERT(x) #else // !USE_MFC #include #define _REF_ASSERT(x) assert(x) #endif // USE_MFC #endif // NO_DEBUG_SYNCHRO #endif #ifdef WIN32 #define YIELD(hwnd,reps) (void)0 #else #define YIELD(hwnd,reps) \ {MSG msg;int n=(int)(reps);while( n-- && PeekMessage( &msg, hwnd, 0, 0, PM_REMOVE ) ){TranslateMessage( &msg );DispatchMessage( &msg );}} #endif #define SAFE_ADDREF(p) if( NULL != p ) { ( p )->AddRef(); } #define SAFE_DELETE(p) if( NULL != p ) { delete p; p = NULL; } #define SAFE_ARRAY_DELETE(p) if( NULL != p ) { delete [] p; p = NULL; } #define SAFE_RELEASE(p) if( NULL != p ) { ( p )->Release(); p = NULL; } #define SAFE_SHUTRELEASE(p) if( NULL != p ) { ( p )->Shutdown(); ( p )->Release(); p = NULL; } #define SAFE_COTASKMEMFREE(p) if( NULL != p ) { CoTaskMemFree( p ); p = NULL; } #define SAFE_SYSFREESTRING(p) if( NULL != p ) { SysFreeString( p ); p = NULL; } #define SAFE_ARRAYDELETE(p) if( NULL != p ) { delete [] p; p = NULL; } #define SAFE_CLOSEHANDLE( h ) if( NULL != h ) { CloseHandle( h ); h = NULL; } #define SAFE_CLOSEFILEHANDLE( h ) if( INVALID_HANDLE_VALUE != h ) { CloseHandle( h ); h = INVALID_HANDLE_VALUE; } #define SAFE_GLOBALFREE(p) if( NULL != p ) { GlobalFree( p ); p = NULL; } // // Ref-count safe assignment of 'src' to 'dst' // #define SAFE_REPLACEREF( dst, src ) \ { \ if( NULL != ( src ) ) \ { \ ( src )->AddRef( ); \ } \ if( NULL != ( dst ) ) \ { \ ( dst )->Release( ); \ } \ dst = src; \ } ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////// OUTPARAMETER VALIDATION AND INITIALIZATION ////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #ifdef __tagVARIANT inline HRESULT ValidateOutPtr( VARIANT* pDest, VARIANT& /*bogus*/ ) { if( reinterpret_cast< VARIANT* >( NULL ) == pDest ) { return( E_POINTER ); } ::VariantClear( pDest ); return( S_OK ); } #endif template< class Tptr, class T > HRESULT ValidateOutPtr( Tptr& pVal, T&/* bogus*/ ) { if( reinterpret_cast< Tptr >( NULL ) == pVal ) { return( E_POINTER ); } *pVal = static_cast< T >( 0 ); return( S_OK ); } // Validate a pointer argument and initialize it if valid. #define VALIDOUT_PTR( pVal ) \ { \ HRESULT hr = ValidateOutPtr( pVal, *pVal ); \ if( FAILED( hr ) ) \ { \ return( hr ); \ } \ } ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////// UTILITY MACROS////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// #define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0])) #endif // __WMSSTD_H__