#ifndef __HSS_DBG_HSS__
#define __HSS_DBG_HSS__
/**************************************************************************************************\
* 2009-06-28
调试信息输出的宏版
(1) 一定起作用的宏
__trace, __trace_file, __trace_fmt, __trace_end
(2) 需要定义 __dbg__才有作用的宏
__if, _if, __trace_dbg, __trace_file_dbg, __trace_fmt_dbg, __trace_end_dbg
(宏名dbg在后面,是为了在搜索__trace的时候可以找到所有的宏)
(3) 用法示例:
__trace "a=%d b=%d\r\n", a, b); __trace_end
__trace_file "a=%d b=%d\r\n", a, b); __trace_end
//注意:这个宏有参数 ,并且在宏的参数括号的后面,不能有逗号
__trace_fmt(__FILE__, __LINE__, TRUE) "a=%d b=%d", a, b); __trace_end
其中__FILE__可以替换为其他文件名,若是全路径会只显示文件名
(4) __if 是长格式版,显示条件的内容
(5) _if 是短格式版,不显示条件的内容,仅显示条件的值
\**************************************************************************************************/
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define __trace_end if (__sztrace && __sztrace[0]) \
OutputDebugStringA(__sztrace); \
}
#define __trace \
{ \
char __sztrace[260] = {0}; \
_snprintf(__sztrace, sizeof(__sztrace),
#define __trace_file \
{ \
char __sztrace[260] = {0}; \
int _n = _snprintf(__sztrace, sizeof(__sztrace)-1, "%08X %s/%d ", GetCurrentThreadId(), strrchr(__FILE__, '\\') + 1, __LINE__); \
_snprintf(__sztrace+_n, sizeof(__sztrace)-_n-1,
#define __trace_fmt(file, line, error) \
{ \
char __sztrace[260] = {0}; \
int __n = 0; \
if (file && ((char*)file)[0]) \
{ \
LPCTSTR __p = strrchr(file, '\\'); \
if (__p == 0) \
__p = file; \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "%s ", __p); \
} \
if (line) \
{ \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "/%d ", line); \
} \
if (error) \
{ \
int se = GetLastError(); \
LPSTR __lpMsgbuf = 0; \
if (FormatMessage( \
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
NULL, \
se, \
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
(LPSTR) & __lpMsgbuf, \
0, \
NULL) \
) \
{ \
if (__lpMsgbuf && __lpMsgbuf[0]) \
{ \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "%s (%d) ", __lpMsgbuf, se); \
} \
if (__lpMsgbuf) \
{ \
LocalFree( __lpMsgbuf ); \
} \
} \
} \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n,
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//sample : __trace_bytes("profix", pData, cbData) __trace_end;
#define __trace_bytes(Profix, pData, cbData) \
{ \
int __size = cbData * 3 + (Profix == 0 ? 0 : strlen(Profix)) + 32; \
char* __sztrace = (char*)alloca(__size); \
LPBYTE __p = (LPBYTE)pData; \
if (__sztrace) \
{ \
int __n = _snprintf(__sztrace, __size-1, "%s", Profix); \
for (int __l = 0 ; __l < cbData ; __l ++) \
{ \
DWORD __d = (DWORD)__p[__l]; \
__n += _snprintf(__sztrace + __n, __size-1-__n, "%02X ", __d); \
} \
__n += _snprintf(__sztrace + __n, __size-1-__n, "(%d)", cbData); \
__sztrace[__n] = 0; \
__sztrace[__size-1] = 0; \
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define __FL__ __trace_file "\r\n");__trace_end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef __dbg__
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define __trace_end_dbg __trace_end
#define __trace_dbg __trace
#define __trace_file_dbg __trace_file
#define __trace_fmt_dbg __trace_fmt
/**************************************************************************************************\
* 2009-06-28
显示程序的分支和判断的值
长格式:__if 显示判断的条件的文本
短格式:_if 不显示判断的条件的文本
\**************************************************************************************************/
#define __if_false(x) \
{ \
char __szif[256] = {0}; \
if (!(x)) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
OutputDebugStringA(__szif); \
} \
} \
if (x)
///////////////////////////////////////////////////////////////////////////////////////////////////
#define __if_true(x) \
{ \
char __szif[256] = {0}; \
if (x) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
OutputDebugStringA(__szif); \
} \
} \
if (x)
///////////////////////////////////////////////////////////////////////////////////////////////////
#define __if(x) \
{ \
char __szif[256] = {0}; \
if (x) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
else \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
OutputDebugStringA(__szif); \
} \
if (x)
///////////////////////////////////////////////////////////////////////////////////////////////////
#define _if(x) \
{ \
char __szif[256] = {0}; \
if (x) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d \r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
else \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d \r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
OutputDebugStringA(__szif); \
} \
if (x)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#else
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define _if(x) if(x)
#define __if(x) if(x)
#define __if_true(x) if(x)
#define __if_false(x) if(x)
#define __trace_end_dbg }
#define __trace_dbg if (0) { (
#define __trace_file_dbg if (0) { (
#define __trace_fmt_dbg if (0) { (
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif