xLogWnd.h
上传用户:jyxwjx
上传日期:2020-03-13
资源大小:221k
文件大小:6k
源码类别:

多显示器编程

开发平台:

Visual C++

  1. // xLogWnd.h: interface for the xLogWnd class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #pragma once
  5. // [xLogWnd Handling Document at 20040528 by numsealsoft]
  6. //
  7. // 肺弊酒眶阑 荤侩窍妨搁 促澜阑 曼炼窍绞矫坷
  8. // 肺弊酒眶狼 蜡屈篮 技啊瘤涝聪促.
  9. //
  10. // 1) 老馆肺弊 : 老馆利牢 格利栏肺 荤侩邓聪促.
  11. // 2) 版绊肺弊 : 版绊己 格利栏肺 荤侩邓聪促.
  12. // 3) 俊矾肺弊 : 俊矾惯积矫 荤侩邓聪促.
  13. //
  14. // 促澜苞 鞍篮 规过栏肺 荤侩窍绞矫坷.
  15. // A) XLOGOUT:老馆肺弊
  16. // Ex1: XLOGOUT(_T("printf狼 屈侥栏肺 器杆泼窍绞矫坷."));
  17. // Ex2: XLOGOUT(_T("%04d : 老馆肺弊涝聪促."), 100);
  18. //
  19. // B) XLOGWAR:版绊肺弊
  20. // Ex1: XLOGWAR(_T("%04d : 版绊肺弊涝聪促."), 100);
  21. //
  22. // C) XLOGERR:俊矾肺弊
  23. // Ex1: XLOGERR(_T("%04d : 俊矾肺弊涝聪促."), 100);
  24. //
  25. // 磊技茄 肺弊酒眶阑 困茄 待橇甫 瘤盔钦聪促.
  26. // Prepare Ex)
  27. // TCHAR pDump[2048];
  28. // ::lstrcpy(pDump, _T("捞巴篮 待橇单捞磐涝聪促."), 10);
  29. //
  30. // A) XDUMPOUT:老馆肺弊
  31. // Ex1: XDUMPOUT(pDump)(_T("%04d : 老馆肺弊涝聪促."), 100);
  32. //
  33. // B) XDUMPWAR:版绊肺弊
  34. // Ex1: XDUMPWAR(pDump)(_T("%04d : 版绊肺弊涝聪促."), 100);
  35. //
  36. // C) XDUMPERR:老馆肺弊
  37. // Ex1: XDUMPERR(pDump)(_T("%04d : 俊矾肺弊涝聪促."), 100);
  38. //
  39. // 歹宽 磊技茄 肺弊酒眶阑 瘤盔钦聪促.
  40. // GetLastError()狼 皋矫瘤绰 待橇邓聪促.
  41. //
  42. // A) XLOGOUT_LASTERROR : GetLastError()甫 器杆泼钦聪促.
  43. // Ex1:
  44. // try {
  45. // ... some error
  46. // } catch (...) {
  47. // XLOGOUT_LASTERROR;
  48. // }
  49. //
  50. //
  51. static  LPCTSTR    g_logOut                = _T("xLogWnd");
  52. static  LPCTSTR    g_logOutwindowClassName = _T("xLogWnd Receiver");
  53. // iType
  54. #define XLIT_ADVANCE 0
  55. #define XLIT_WARNING 1
  56. #define XLIT_ERROR 2
  57. // Buffer Limitation
  58. #define _MAX_FROM 1024
  59. #define _MAX_WHERE 1024
  60. #define _MAX_MESSAGE 2048
  61. #define _MAX_DUMP 2048
  62. typedef struct _XLOGITEM {
  63. int iType;
  64. TCHAR pszFrom[_MAX_FROM];
  65. TCHAR pszWhere[_MAX_WHERE];
  66. TCHAR pszMessage[_MAX_MESSAGE];
  67. TCHAR pszDump[_MAX_DUMP];
  68. } XLOGITEM, FAR* LPXLOGITEM;
  69. inline void _LogOut (int nType, LPCTSTR pFrom, LPCTSTR pWhere, LPCTSTR pMessage, LPCTSTR pDump)
  70. {
  71.     COPYDATASTRUCT cd; 
  72.     HWND hWnd = ::FindWindow (g_logOutwindowClassName, g_logOut); 
  73.     if (hWnd)
  74.     {  
  75. XLOGITEM li;
  76. ::memset(&li, NULL, sizeof(XLOGITEM));
  77. li.iType = nType;
  78. if (pFrom)
  79. {
  80. #ifdef _UNICODE
  81. ::lstrcpynW(li.pszFrom, pFrom, _MAX_FROM);
  82. #else
  83. ::lstrcpyn(li.pszFrom, pFrom, _MAX_FROM);
  84. #endif
  85. }
  86. if (pWhere)
  87. {
  88. #ifdef _UNICODE
  89. ::lstrcpynW(li.pszWhere, pWhere, _MAX_WHERE);
  90. #else
  91. ::lstrcpyn(li.pszWhere, pWhere, _MAX_WHERE);
  92. #endif
  93. }
  94. if (pMessage)
  95. {
  96. #ifdef _UNICODE
  97. ::lstrcpynW(li.pszMessage, pMessage, _MAX_MESSAGE);
  98. #else
  99. ::lstrcpyn(li.pszMessage, pMessage, _MAX_MESSAGE);
  100. #endif
  101. }
  102. if (pDump)
  103. {
  104. #ifdef _UNICODE
  105. ::lstrcpynW(li.pszDump, pDump, _MAX_DUMP);
  106. #else
  107. ::lstrcpyn(li.pszDump, pDump, _MAX_DUMP);
  108. #endif
  109. }
  110. #ifdef _UNICODE
  111.         cd.dwData = 0xFEFF;
  112. #else
  113. cd.dwData = 0;
  114. #endif
  115.         cd.cbData = sizeof(XLOGITEM);
  116.         cd.lpData = (void *)&li;
  117.         ::SendMessage (hWnd, WM_COPYDATA, 0, (LPARAM)&cd);
  118.     } 
  119. }
  120. inline LPCTSTR LogFormat (LPCTSTR pFormat, ...)
  121. {
  122. va_list args;
  123. va_start(args, pFormat);
  124. static _TCHAR buffer[2048] = {0,};
  125. wvsprintf(buffer, pFormat, args);
  126.     va_end(args);
  127. return buffer;
  128. }
  129. inline void LogOut (int iType, void* pFilename, unsigned int lineno, LPCTSTR pszMessage, LPCTSTR pDump = NULL)
  130. {
  131.     TCHAR where[_MAX_WHERE] = {0,};
  132. TCHAR Filename[_MAX_WHERE] = {0,};
  133. #ifdef _UNICODE
  134. MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pFilename, (int)strlen((LPCSTR)pFilename)+1, Filename, (int)sizeof(Filename)/sizeof(Filename[0]) );
  135. #else
  136. ::lstrcpyn(Filename, (LPTSTR)pFilename, _MAX_WHERE);
  137. #endif
  138. wsprintf(where, _T("%d line in %s"), lineno, (LPTSTR)Filename);
  139.     _LogOut (iType, ::AfxGetAppName(), where, pszMessage, pDump);
  140. }
  141. inline DWORD LogOutLastError (void* pFilename, unsigned int lineno, LPCTSTR pszMessage)
  142. {
  143.    if (::GetLastError() == 0) 
  144.         return 0;
  145.    
  146.     LPVOID pDump;
  147.     DWORD  result;
  148.     result = ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  149.                              NULL,
  150.                              GetLastError(),
  151.                              MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  152.                              (LPTSTR)&pDump,
  153.                              0,
  154.                              NULL);
  155.   
  156.     ::LogOut(XLIT_ERROR, pFilename, lineno, pszMessage, (LPCTSTR)pDump);
  157.     
  158.     if(result)
  159.         ::LocalFree(pDump);
  160.    
  161.     return result;
  162. }
  163. class CxLogSystem {
  164. public:
  165. CxLogSystem(int nType, void* pFrom, int nLineno, LPCTSTR pDump = NULL)
  166. : m_pFrom(pFrom), m_nLineno(nLineno), m_nType(nType), m_pDump(pDump), m_nLastError(0)
  167. {
  168. }
  169. CxLogSystem(int nType, void* pFrom, int nLineno, int nLastError)
  170. : m_pFrom(pFrom), m_nLineno(nLineno), m_nType(nType), 
  171. m_pDump(NULL), m_nLastError(nLastError)
  172. {
  173. }
  174. inline void Trace(LPCTSTR pFormat, ...)
  175. {
  176. va_list args;
  177. va_start(args, pFormat);
  178. static _TCHAR buffer[2048] = {0,};
  179. wvsprintf(buffer, pFormat, args);
  180. va_end(args);
  181. LogOut(m_nType, m_pFrom, m_nLineno, buffer, m_pDump);
  182. }
  183. inline void TraceLastError()
  184. {
  185. if (m_nLastError == 0)
  186. return;
  187. static _TCHAR buffer[2048] = {0,};
  188. wsprintf(buffer, _T(" %d : the calling thread's last-error code value"), m_nLastError);
  189. LPVOID pDump;
  190. DWORD  result;
  191. result = ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  192.  NULL,
  193.  m_nLastError,
  194.  MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  195.  (LPTSTR)&pDump,
  196.  0,
  197.  NULL);
  198. ::LogOut(XLIT_ERROR, m_pFrom, m_nLineno, buffer, (LPCTSTR)pDump);
  199. if(result)
  200. ::LocalFree(pDump);
  201. }
  202. protected:
  203. int m_nLastError;
  204. int m_nType;
  205. int m_nLineno;
  206. void* m_pFrom;
  207. LPCTSTR m_pDump;
  208. };
  209. // XLOGOUT
  210. #define XLOGFMT ::LogFormat
  211. #define XLOGOUT CxLogSystem(XLIT_ADVANCE, __FILE__, __LINE__).Trace
  212. #define XLOGWAR CxLogSystem(XLIT_WARNING, __FILE__, __LINE__).Trace
  213. #define XLOGERR CxLogSystem(XLIT_ERROR, __FILE__, __LINE__).Trace
  214. #define XDUMPOUT(dump) CxLogSystem(XLIT_ADVANCE, __FILE__, __LINE__, dump).Trace
  215. #define XDUMPWAR(dump) CxLogSystem(XLIT_WARNING, __FILE__, __LINE__, dump).Trace
  216. #define XDUMPERR(dump) CxLogSystem(XLIT_ERROR, __FILE__, __LINE__, dump).Trace
  217. // XLOGOUT_LASTERROR
  218. #define XLOGOUT_LASTERROR CxLogSystem(XLIT_ERROR, __FILE__, __LINE__, GetLastError()).TraceLastError()