Commit 9910e719 authored by captainwong's avatar captainwong

save

parent 8b06dd1d
// FileOper.h: interface for the CFileOper class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_FILEOPER_H__25D4B209_DAC6_4D93_98B2_692621E5508F__INCLUDED_)
#define AFX_FILEOPER_H__25D4B209_DAC6_4D93_98B2_692621E5508F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <stdio.h>
#include <shellapi.h>
#include <Shlobj.h>
#include "MtVerify.h"
#include "safe_mem.h"
static int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
......@@ -313,4 +304,3 @@ protected:
}
};
#endif // !defined(AFX_FILEOPER_H__25D4B209_DAC6_4D93_98B2_692621E5508F__INCLUDED_)
// Log.h: interface for the CLog class.
//
//////////////////////////////////////////////////////////////////////
/*
日志类CLog
简述:单例的日志输出类,使用时会自动构造,但因为要保证日志类最后一个析构,需要手动释放
功能:写日志,输出TRACE内容到dbgview,console。
使用:
使用函数
static void SetOutputLogFileName(LPCTSTR szFileName);
static void SetOutputConsole(BOOL bFlag);
static void SetOutputDbgView(BOOL bFlag);
static void SetOutputLogFile(BOOL bFlag);
来设置输出日志的方式
使用TRACE或使用函数static void WriteLog(const char* format, ...);写日志,可接受可变参数
释放:在程序退出时(ExitInstance()函数的最后)调用CLog::Release()释放引用计数
*/
#if !defined(AFX_ERRORLOG_H__46D664F1_E737_46B7_9813_2EF1415FF884__INCLUDED_)
#define AFX_ERRORLOG_H__46D664F1_E737_46B7_9813_2EF1415FF884__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <assert.h>
//#include "dbghlpapi.h"
//#ifdef TRACE
//#undef TRACE
//#define TRACE CLog::WriteLog
//#endif
#include <assert.h>
#include <fstream>
#include <string>
#include <mutex>
namespace jlib
{
#define MAX_OUTPUT_LEN (1024 * 64)
#define MAX_FILE_LEN (1024 * 1024 * 10)
#define IMPLEMENT_CLASS_LOG_STATIC_MEMBER \
CRITICAL_SECTION CLog::m_cs;\
......@@ -42,37 +22,24 @@ namespace jlib
CLog* CLog::m_pInstance = NULL;\
TCHAR CLog::g_szFileName[1024] = { 0 };
/*
#define TRACEFUNCNAME \
CString str = _T("");\
INIT_SYM(TRUE);\
str.Format("File %s, line %d, funcname %s\n", __FILE__, __LINE__, __FUNCNAME__);\
OutputDebugString(str);\
UNINIT_SYM();\
*/
#define MAX_OUTPUT_LEN (1024 * 64)
#define MAX_FILE_LEN (1024 * 1024 * 10)
//static TCHAR g_szFileName[1024] = {0};
class CLog
{
private:
#pragma region private members
double exe_time;
LARGE_INTEGER freq;
LARGE_INTEGER start_t, stop_t;
BOOL m_bOutputLogFile;
BOOL m_bOutputDbgView;
BOOL m_bOutputConsole;
BOOL m_bConsoleOpened;
BOOL m_bDbgviewOpened;
BOOL m_bLogFileOpened;
BOOL m_bRunning;
bool m_bOutputLogFile;
bool m_bOutputDbgView;
bool m_bOutputConsole;
bool m_bConsoleOpened;
bool m_bDbgviewOpened;
bool m_bLogFileOpened;
bool m_bRunning;
FILE *m_pLogFile;
PROCESS_INFORMATION pi;
static TCHAR g_szFileName[1024];
static CRITICAL_SECTION m_cs;
static CLock m_lockForSingleton;
static std::wstring _log_file_path;
static std::mutex _lock;
static std::mutex _lock_for_singleton;
static char m_ansiBuf[MAX_OUTPUT_LEN];
static wchar_t m_utf16Buf[MAX_OUTPUT_LEN];
static CLog* m_pInstance;
......@@ -81,62 +48,51 @@ namespace jlib
public:
#pragma region public functions
static const wchar_t* GetLogFilePath() { return g_szFileName; }
static std::wstring GetLogFilePath() { return _log_file_path; }
static CLog* GetInstance()
{
m_lockForSingleton.Lock();
std::lock_guard<std::mutex> lg(_lock_for_singleton);
if (CLog::m_pInstance == NULL) {
static CLog log;
CLog::m_pInstance = &log;
}
m_lockForSingleton.UnLock();
return CLog::m_pInstance;
}
~CLog()
{
m_bRunning = FALSE;
//WaitTillThreadExited(m_handle);
if (m_bConsoleOpened)
OpenConsole(FALSE);
OpenConsole(false);
if (m_bDbgviewOpened)
OpenDbgview(FALSE);
OpenDbgview(false);
if (m_bLogFileOpened)
CloseLogFile();
DeleteCriticalSection(&m_cs);
#ifdef _DEBUG
TCHAR buf[1024], out[1024];
wsprintf(buf, _T("%s\n"), _T("CLog::~CLog() destruction"));
FormatBuf(buf, out, 1024);
OutputDebugString(out);
#endif
}
static void SetOutputLogFileName(LPCTSTR szLastName)
static void SetOutputLogFilePath(const std::wstring& logFilePath)
{
lstrcpy(g_szFileName, szLastName);
_log_file_path = _log_file_path;
}
static void SetOutputConsole(BOOL bFlag)
static void SetOutputConsole(bool b = true)
{
CLog* plog = CLog::GetInstance();
plog->m_bOutputConsole = bFlag;
plog->OpenConsole(bFlag);
plog->m_bOutputConsole = b;
plog->OpenConsole(b);
}
static void SetOutputDbgView(BOOL bFlag)
static void SetOutputDbgView(bool b = true)
{
CLog* plog = CLog::GetInstance();
plog->m_bOutputDbgView = bFlag;
//plog->OpenDbgview(bFlag);
plog->m_bOutputDbgView = b;
}
static void SetOutputLogFile(BOOL bFlag)
static void SetOutputLogFile(bool b = true)
{
CLog* plog = CLog::GetInstance();
plog->m_bOutputLogFile = bFlag;
if (plog->m_bOutputLogFile && lstrlen(g_szFileName) == 0)
plog->m_bOutputLogFile = b;
if (plog->m_bOutputLogFile && !_log_file_path.empty())
plog->CreateFileName();
}
......@@ -146,7 +102,7 @@ namespace jlib
CLog* plog = CLog::GetInstance();
if (plog == NULL)
return;
CLocalLock lock(&m_cs);
std::lock_guard<std::mutex> lg(_lock);
if (plog->m_bOutputLogFile || plog->m_bOutputDbgView || plog->m_bOutputConsole) {
size_t output_len = buff_len * 6 + 64;
wchar_t* output = new wchar_t[output_len];
......@@ -176,7 +132,7 @@ namespace jlib
CLog* plog = CLog::GetInstance();
if (plog == NULL)
return;
CLocalLock lock(&m_cs);
std::lock_guard<std::mutex> lg(_lock);
if (plog->m_bOutputLogFile || plog->m_bOutputDbgView || plog->m_bOutputConsole) {
size_t output_len = buff_len * 6 + 64;
wchar_t* output = new wchar_t[output_len];
......@@ -200,15 +156,15 @@ namespace jlib
}
}
static void WriteLog(const TCHAR* format, ...)
static void WriteLog(const wchar_t* format, ...)
{
try {
CLog* plog = CLog::GetInstance();
if (plog == NULL)
return;
CLocalLock lock(&m_cs);
std::lock_guard<std::mutex> lg(_lock);
if (plog->m_bOutputLogFile || plog->m_bOutputDbgView || plog->m_bOutputConsole) {
static TCHAR buf[MAX_OUTPUT_LEN], output[MAX_OUTPUT_LEN], *p;
static wchar_t buf[MAX_OUTPUT_LEN], output[MAX_OUTPUT_LEN], *p;
p = buf;
va_list args;
va_start(args, format);
......@@ -233,7 +189,7 @@ namespace jlib
CLog* plog = CLog::GetInstance();
if (plog == NULL)
return;
CLocalLock lock(&m_cs);
std::lock_guard<std::mutex> lg(_lock);
if (plog->m_bOutputLogFile || plog->m_bOutputDbgView || plog->m_bOutputConsole) {
static wchar_t buf[MAX_OUTPUT_LEN], *p;
p = buf;
......@@ -274,7 +230,7 @@ namespace jlib
CLog* plog = CLog::GetInstance();
if (plog == NULL)
return;
CLocalLock lock(&m_cs);
std::lock_guard<std::mutex> lg(_lock);
if (plog->m_bOutputLogFile || plog->m_bOutputDbgView || plog->m_bOutputConsole) {
static char buf[MAX_OUTPUT_LEN], *p;
p = buf;
......
......@@ -3,113 +3,6 @@
#include <crtdbg.h>
#include <tchar.h>
#pragma comment(lib, "version.lib")
#define MTVERIFY(a) (a)
#if 0
#define SHOWERROR(a) PrintError(a,__FILE__,__LINE__,GetLastError())
#ifdef DEBUG
#define MTASSERT(a) _ASSERTE(a)
#define MTVERIFY(a) if (!(a)) PrintError(#a,__FILE__,__LINE__,GetLastError())
#else /*DEBUG*/
#define MTASSERT(a)
#define MTVERIFY(a) (a)
#endif /*DEBUG*/
__inline void PrintError(LPCTSTR linedesc, LPCTSTR filename, int lineno, DWORD errnum)
{
LPTSTR lpBuffer;
TCHAR errbuf[256];
#ifdef _WINDOWS_
TCHAR modulename[MAX_PATH];
#else //_WINDOWS_
DWORD numread;
#endif //_WINDOWS_
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
errnum,
LANG_NEUTRAL,
(LPTSTR)&lpBuffer,
0,
NULL
);
_stprintf(errbuf, _T("\nThe following call failed at line %d in %s:\n\n %s\n\nReason: %s\n"),
lineno, filename, linedesc, lpBuffer);
#ifndef _WINDOWS_
WriteFile(GetStdHandle(STD_ERROR_HANDLE), errbuf, lstrlen(errbuf), &numread, FALSE );
Sleep(3000);
#else //_WINDOWS_
GetModuleFileName(NULL, modulename, MAX_PATH);
MessageBox(NULL, errbuf, modulename, MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);
OutputDebugString(errbuf);
#endif //_WINDOWS_
LocalFree(lpBuffer);
//exit(EXIT_FAILURE);
}
#endif
__inline void WaitTillThreadActive(HANDLE &handle)
{
if (handle != INVALID_HANDLE_VALUE) {
BOOL rc = FALSE;
DWORD ec = 0;
for (;;) {
rc = GetExitCodeThread(handle, &ec);
if (rc && (ec == STILL_ACTIVE))
break;
Sleep(500);
}
}
}
// obsolete
/*
__inline void WaitTillThreadExited(HANDLE &handle, DWORD dwMilliseconds = 3000)
{
if(handle != INVALID_HANDLE_VALUE)
{
BOOL rc = FALSE;
DWORD ec = 0;
DWORD dwStart = GetTickCount();
for(;;)
{
if(GetTickCount() - dwStart >= dwMilliseconds)
{
::TerminateThread(handle, 0xffffffff);
CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;
break;
}
if(handle == INVALID_HANDLE_VALUE)
break;
rc = GetExitCodeThread(handle, &ec);
if(rc && (ec != STILL_ACTIVE))
{
CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;
break;
}
Sleep(500);
}
}
}
*/
__forceinline void WaitTillThreadExited(HANDLE &handle, DWORD dwMilliseconds = 5000)
{
if (handle == INVALID_HANDLE_VALUE)
return;
DWORD ret = ::WaitForSingleObject(handle, dwMilliseconds);
if (ret != WAIT_OBJECT_0) { //::TerminateThread(handle, 0xffffffff);
}
CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;
}
__inline LPTSTR GetModuleFilePath()
{
......
#pragma once
#include <chrono>
#include "safe_mem.h"
#include "utf8.h"
#include "LocalLock.h"
#include "mtverify.h"
#include "FileOper.h"
#include "Log.h"
#include "MyWSAError.h"
#include "observer_macro.h"
......
#pragma once
/////////*********************自定义宏********************////////////////////////
//安全删除普通堆内存
#define SAFEDELETEP(p) {if(p){delete (p); (p)=NULL;}}
#define SAFEDELETEARR(pArr) {if((pArr)){delete[] (pArr); (pArr)=NULL;}}
//安全删除对话框类堆内存
#define SAFEDELETEDLG(pDlg) {\
if ((pDlg)) {\
if (::IsWindow(pDlg->m_hWnd)) { \
(pDlg)->DestroyWindow(); \
}\
delete (pDlg); \
(pDlg) = NULL; \
}\
}
//关闭核心对象句柄
#define CLOSEHANDLE(h){\
if (h != INVALID_HANDLE_VALUE && h != NULL) {\
::CloseHandle(h); \
h = INVALID_HANDLE_VALUE; \
}\
}
#define CLOSESOCKET(s){\
if (s != INVALID_SOCKET) { \
::closesocket(s); \
s = INVALID_SOCKET; \
}\
}
......@@ -2,8 +2,9 @@
//
#include "stdafx.h"
#include "../../global.h"
#include "../../safe_mem.h"
#include "../../utf8.h"
#include "../../Log.h"
int main()
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment