#ifndef __inc_common_h #define __inc_common_h /*----------------------------------------------------------------------------- / Debugging APIs (use the Macros, they make it easier and cope with correctly / removing debugging when it is disabled at built time). /----------------------------------------------------------------------------*/ #define TRACE_COMMON_ASSERT 0x80000000 #define TRACE_COMMON_MISC 0x40000000 #ifdef DBG EXTERN_C void DoTraceSetMask(DWORD dwMask); EXTERN_C void DoTraceSetMaskFromCLSID(REFCLSID rCLSID); EXTERN_C void DoTraceEnter(DWORD dwMask, LPCTSTR pName); EXTERN_C void DoTraceLeave(void); EXTERN_C LPCTSTR DoTraceGetCurrentFn(VOID); EXTERN_C void DoTrace(LPCTSTR pFormat, ...); EXTERN_C void DoTraceGUID(LPCTSTR pPrefix, REFGUID rGUID); EXTERN_C void DoTraceAssert(int iLine, LPTSTR pFilename); #else // DBG not defined (e.g. retail build) #define DoTraceMask(mask) #define DoTraceSetMaskFromCLSID(rCLSID) #define DoTraceEnter(dwMask, pName) #define DoTraceLeave() #define DoTraceGetCurrentFn() ("") #define DoTrace 1 ? (void) 0: (void) #define DoTraceGUID(pPrefix, rGUID) #define DoTraceAssert( iLine , pFilename) #endif // DBG /*----------------------------------------------------------------------------- / Macros to ease the use of the debugging APIS. /----------------------------------------------------------------------------*/ #if DBG #define DSUI_DEBUG 1 #define debug if ( TRUE ) #else #undef DSUI_DEBUG #define debug #endif #define TraceSetMask(dwMask) debug DoTraceSetMask(dwMask) #define TraceSetMaskFromCLSID(rCLSID) debug DoTraceSetMaskFromCLSID(rCLSID) #define TraceEnter(dwMask, fn) debug DoTraceEnter(dwMask, TEXT(fn)) #define TraceLeave debug DoTraceLeave #define Trace debug DoTrace #define TraceMsg(s) debug DoTrace(TEXT(s)) #define TraceGUID(s, rGUID) debug DoTraceGUID(TEXT(s), rGUID) #ifdef DSUI_DEBUG #define TraceAssert(x) \ { if ( !(x) ) DoTraceAssert(__LINE__, TEXT(__FILE__)); } #define TraceLeaveResult(hr) \ { HRESULT __hr = hr; if (FAILED(__hr)) Trace(TEXT("Failed (%08x)"), hr); TraceLeave(); return __hr; } #define TraceLeaveVoid() \ { TraceLeave(); return; } #define TraceLeaveValue(value) \ { TraceLeave(); return(value); } #else #define TraceAssert(x) #define TraceLeaveResult(hr) { return hr; } #define TraceLeaveVoid() { return; } #define TraceLeaveValue(value) { return(value); } #endif // // flow control helpers, these expect you to have a exit_gracefully: label // defined in your function which is called to exit the body of the // routine. // #define ExitGracefully(hr, result, text) \ { TraceMsg(text); hr = result; goto exit_gracefully; } #define FailGracefully(hr, text) \ { if ( FAILED(hr) ) { TraceMsg(text); goto exit_gracefully; } } // // Some atomic free macros (should be replaced with calls to the shell ones) // #define DoRelease(pInterface) \ { if ( pInterface ) { pInterface->Release(); pInterface = NULL; } } #define DoILFree(pidl) \ { ILFree(pidl); pidl = NULL; } /*----------------------------------------------------------------------------- / String/byte helper macros /----------------------------------------------------------------------------*/ #define StringByteSizeA(sz) ((sz) ? ((lstrlenA(sz)+1)*SIZEOF(CHAR)):0) #define StringByteSizeW(sz) ((sz) ? ((lstrlenW(sz)+1)*SIZEOF(WCHAR)):0) #define StringByteCopyA(pDest, iOffset, sz) \ { CopyMemory(&(((LPBYTE)pDest)[iOffset]), sz, StringByteSizeA(sz)); } #define StringByteCopyW(pDest, iOffset, sz) \ { CopyMemory(&(((LPBYTE)pDest)[iOffset]), sz, StringByteSizeW(sz)); } #ifndef UNICODE #define StringByteSize StringByteSizeA #define StringByteCopy StringByteCopyA #else #define StringByteSize StringByteSizeW #define StringByteCopy StringByteCopyW #endif #define ByteOffset(base, offset) (((LPBYTE)base)+offset) // // Lifted from ccstock.h // #ifndef InRange #define InRange(id, idFirst, idLast) ((UINT)((id)-(idFirst)) <= (UINT)((idLast)-(idFirst))) #endif #define SAFECAST(_obj, _type) (((_type)(_obj)==(_obj)?0:0), (_type)(_obj)) /*----------------------------------------------------------------------------- / Helper functions (misc.cpp) /----------------------------------------------------------------------------*/ EXTERN_C HRESULT GetKeyForCLSID(REFCLSID clsid, LPCTSTR pSubKey, HKEY* phkey); EXTERN_C HRESULT PutRegistryString(HINSTANCE hInstance, UINT uID, HKEY hKey, LPCTSTR pSubKey, LPCTSTR pValue); EXTERN_C HRESULT GetRealWindowInfo(HWND hwnd, LPRECT pRect, LPSIZE pSize); EXTERN_C VOID OffsetWindow(HWND hwnd, INT dx, INT dy); EXTERN_C HRESULT CallRegInstall(HINSTANCE hInstance, LPSTR szSection); EXTERN_C VOID SetDefButton(HWND hwndDlg, int idButton); EXTERN_C HRESULT AllocStorageMedium(FORMATETC* pFmt, STGMEDIUM* pMedium, SIZE_T cbStruct, LPVOID* ppAlloc); EXTERN_C HRESULT CopyStorageMedium(FORMATETC* pFmt, STGMEDIUM* pMediumDst, STGMEDIUM* pMediumSrc); // // The shell defines these on newer platforms, but for downlevel clients we will use our // own home grown (stollen versions) // EXTERN_C BOOL GetGUIDFromString(LPCTSTR psz, GUID* pguid); EXTERN_C INT GetStringFromGUID(UNALIGNED REFGUID rguid, LPTSTR psz, INT cchMax); #ifndef UNICODE EXTERN_C BOOL GetGUIDFromStringW(LPCWSTR psz, GUID* pguid); #else #define GetGUIDFromStringW(a, b) GetGUIDFromString(a, b) #endif // // replace LoadStringW with our own version that will work on the downlevel platforms // #ifndef UNICODE EXTERN_C INT MyLoadStringW(HINSTANCE hInstance, UINT uID, LPWSTR pszBuffer, INT cchBuffer); #define LoadStringW MyLoadStringW #endif #endif