stdafx.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // stdafx.cpp : 只包括标准包含文件的源文件
  2. // test.pch 将作为预编译头
  3. // stdafx.obj 将包含预编译类型信息
  4. #include "stdafx.h"
  5. #include <time.h> //或者 #include <ctime>
  6. #include <locale.h>
  7. // TODO: 在 STDAFX.H 中
  8. // 引用任何所需的附加头文件,而不是在此文件中引用
  9. /************************************************************************/
  10. /* 函数:[7/3/2018 Wang];
  11. /* 描述:;
  12. /* 参数:;
  13. /* [IN] :;
  14. /* [OUT] :;
  15. /* [IN/OUT] :;
  16. /* 返回:void;
  17. /* 注意:非线程安全;
  18. /* 示例:;
  19. /*
  20. /* 修改:;
  21. /* 日期:;
  22. /* 内容:;
  23. /************************************************************************/
  24. void ShowSystemErrorInfo( LPCTSTR lpszTitle,const DWORD &dwError)
  25. {
  26. LPVOID lpMsgBuf;
  27. static TCHAR szResult[MAX_PATH] = {0};
  28. memset(szResult, 0, sizeof(TCHAR)*MAX_PATH);
  29. BOOL fOk = FormatMessage(
  30. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  31. FORMAT_MESSAGE_FROM_SYSTEM |
  32. FORMAT_MESSAGE_IGNORE_INSERTS,
  33. NULL,
  34. dwError,
  35. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  36. (LPTSTR)&lpMsgBuf,
  37. 0, NULL);
  38. if (!fOk)
  39. {
  40. // Is it a network-related error?
  41. HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES);
  42. if (hDll != NULL)
  43. {
  44. FormatMessage(
  45. FORMAT_MESSAGE_FROM_HMODULE |
  46. FORMAT_MESSAGE_FROM_SYSTEM |
  47. FORMAT_MESSAGE_IGNORE_INSERTS,
  48. hDll,
  49. dwError,
  50. MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  51. (LPTSTR)&lpMsgBuf,
  52. 0,
  53. NULL);
  54. FreeLibrary(hDll);
  55. }
  56. }
  57. if (lpMsgBuf != NULL)
  58. {
  59. _stprintf_s(szResult, _T("%s:%ld,%s"), lpszTitle == NULL ? _T("错误") : lpszTitle, dwError, (PCTSTR)LocalLock(lpMsgBuf));
  60. WriteTextLog(szResult);
  61. LocalFree(lpMsgBuf);
  62. }
  63. else
  64. {
  65. _stprintf_s(szResult, _T("%s:未知错误!"),lpszTitle == NULL ? _T("错误") : lpszTitle);
  66. WriteTextLog(szResult);
  67. }
  68. }
  69. /************************************************************************/
  70. /* 函数:WriteTextLog[7/28/2016 IT];
  71. /* 描述:写文本日志;
  72. /* 参数:;
  73. /* [IN] :;
  74. /* 返回:void;
  75. /* 注意:;
  76. /* 示例:;
  77. /*
  78. /* 修改:;
  79. /* 日期:;
  80. /* 内容:;
  81. /************************************************************************/
  82. void WriteTextLog(const TCHAR *format, ...)
  83. {
  84. //static ThreadSection _critSection;
  85. //AutoThreadSection aSection(&_critSection);
  86. // 解析出日志路径;
  87. TCHAR szlogpath[MAX_PATH] = {0};
  88. static TCHAR szModulePath[MAX_PATH] = {0};
  89. static TCHAR szFna[_MAX_DIR] = { 0 };
  90. if ( szModulePath[0] == _T('\0') )
  91. {
  92. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  93. TCHAR szDir[_MAX_DIR] = { 0 };
  94. TCHAR szExt[_MAX_DIR] = { 0 };
  95. ::GetModuleFileName(NULL, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
  96. _tsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
  97. _tcscpy_s(szModulePath, szDrive);
  98. _tcscat_s(szModulePath, szDir);
  99. }
  100. // 获取今年年份;
  101. __time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
  102. struct tm gmtm = {0};
  103. //gmtime_s(&gmtm, &gmt); // 时间戳转成UTC时间(也叫GMT时间);
  104. localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
  105. _stprintf_s(szlogpath, _T("%s%s%04d-%02d-%02d.txt"), szModulePath, szFna, gmtm.tm_year + 1900, gmtm.tm_mon+1, gmtm.tm_mday);
  106. // 打开或创建文件;
  107. #if 0 // MFC
  108. CStdioFile fp;
  109. if (PathFileExists(szlogpath))
  110. {
  111. if (fp.Open(szlogpath, CFile::modeWrite) == FALSE)
  112. {
  113. return;
  114. }
  115. fp.SeekToEnd();
  116. }
  117. else
  118. {
  119. fp.Open(szlogpath, CFile::modeCreate | CFile::modeWrite);
  120. }
  121. // 格式化前设置语言区域;
  122. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  123. _tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
  124. // 格式化日志内容;
  125. va_list args = NULL;
  126. int len = 0;
  127. TCHAR *buffer = NULL;
  128. va_start( args, format );
  129. // _vscprintf doesn't count. terminating '\0'
  130. len = _vsctprintf( format, args ) + 1;
  131. buffer = (TCHAR*)malloc( len * sizeof(TCHAR) );
  132. _vstprintf_s( buffer, len, format, args ); // C4996
  133. // Note: vsprintf is deprecated; consider using vsprintf_s instead
  134. // 将日志内容输入到文件中;
  135. fp.WriteString( CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S ")) );
  136. fp.WriteString(buffer);
  137. fp.WriteString(_T("\n"));
  138. // 关闭文件,释放资源并设置回原语言区域;
  139. free( buffer );
  140. _tsetlocale(LC_CTYPE, old_locale);
  141. free(old_locale);//还原区域设定;
  142. fp.Close();
  143. #else // 不依赖MFC;
  144. FILE *fp = NULL;
  145. fp = _tfopen(szlogpath, _T("a+"));
  146. if ( fp == NULL )
  147. return;
  148. fseek(fp, 0, SEEK_END);
  149. // 格式化前设置语言区域;
  150. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  151. _tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
  152. // 格式化日志内容;
  153. va_list args = NULL;
  154. int len = 0;
  155. TCHAR *buffer = NULL;
  156. va_start( args, format );
  157. // _vscprintf doesn't count. terminating '\0'
  158. len = _vsctprintf( format, args ) + 1;
  159. buffer = (TCHAR*)malloc( len * sizeof(TCHAR) );
  160. _vstprintf_s( buffer, len, format, args ); // C4996
  161. // Note: vsprintf is deprecated; consider using vsprintf_s instead
  162. // 将日志内容输入到文件中;
  163. TCHAR szTime[36] = {0};
  164. _stprintf_s(szTime, _T("%04d-%02d-%02d %02d:%02d:%02d "), gmtm.tm_year + 1900, gmtm.tm_mon+1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec);
  165. fwrite(szTime, _tcslen(szTime)*sizeof(TCHAR), 1, fp);
  166. fwrite(buffer, _tcslen(buffer)*sizeof(TCHAR), 1, fp);
  167. fwrite(_T("\n"), sizeof(TCHAR), 1, fp);
  168. // 关闭文件,释放资源并设置回原语言区域;
  169. free( buffer );
  170. _tsetlocale(LC_CTYPE, old_locale);
  171. free(old_locale);//还原区域设定;
  172. fclose(fp);
  173. #endif
  174. }