#include "log.h"#include <string>#include <Shlwapi.h>#include <stdio.h>#include <fstream>#pragma comment( lib, "Shlwapi.lib" )using namespace std;#define LOG_MSG_SIZE ( 100 * 1024 )static wstring g_wsPath;static wstring g_wsFileName;static BOOL g_bIsOpen = FALSE;static string ToStr( wstring WStr );//**************************************************////fun:若未初始化Log檔案路徑,則初始化Log檔案路徑////pa:PathLog輸出檔案路徑,預設為NULL,則輸出//到可指定檔案目前的目錄下,記錄檔名//與可執行檔名相同////**************************************************VOID LogInit( WCHAR* Path ){if ( NULL == Path ){if ( L"" == g_wsPath ){WCHAR* pwszPath = new WCHAR[_MAX_ENV];ZeroMemory( pwszPath, _MAX_ENV*sizeof(WCHAR) );GetModuleFileNameW( NULL, pwszPath, _MAX_ENV );WCHAR* pwszTemp = wcsrchr( pwszPath, L'.' );(*pwszTemp) = 0;g_wsPath = pwszPath;g_wsPath += L".log";delete[] pwszPath;}}else{g_wsPath = Path;}if ( L"" == g_wsFileName ){WCHAR* pwszPath = new WCHAR[_MAX_ENV];ZeroMemory( pwszPath, _MAX_ENV*sizeof(WCHAR) );GetModuleFileNameW( NULL, pwszPath, _MAX_ENV );WCHAR* pwszTemp = wcsrchr( pwszPath, '\\' );g_wsFileName = pwszPath + 1;delete[] pwszPath;}}//**************************************************////fun:輸出運行流程日誌////pa:Func函數名//File檔案名稱//Line行號//Msg流程日誌資訊////**************************************************VOID LogInfo( CHAR* Func, CHAR* File, DWORD Line, const WCHAR* Msg, ... ){while ( g_bIsOpen ){Sleep(10);}g_bIsOpen = TRUE;LogInit();WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );va_list ArgsList;va_start( ArgsList, Msg );vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );va_end( ArgsList );string sMsg = ToStr( pwszMsg );fstream fFile;fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );fFile<<"******************** Info ********************"<<endl<<endl;fFile<<sMsg.c_str()<<endl<<endl;fFile<<"Fun: "<<Func<<endl;fFile<<"File: "<<File<<endl;fFile<<"Line: "<<Line<<endl;fFile<<"Exe: "<<g_wsFileName.c_str()<<endl<<endl;fFile<<"******************** Info ********************"<<endl<<endl;fFile.close();g_bIsOpen = FALSE;delete[] pwszMsg;}//**************************************************////fun:輸出錯誤記錄檔////pa:Func函數名//File檔案名稱//Line行號//Msg流程日誌資訊////**************************************************VOID LogError( CHAR* Func, CHAR* File, DWORD Line, const WCHAR* Msg, ... ){while ( g_bIsOpen ){Sleep(10);}g_bIsOpen = TRUE;LogInit();WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );va_list ArgsList;va_start( ArgsList, Msg );vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );va_end( ArgsList );string sMsg = ToStr( pwszMsg );fstream fFile;fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );fFile<<"******************** Error ********************"<<endl<<endl;fFile<<sMsg.c_str()<<endl<<endl;fFile<<"Fun: "<<Func<<endl;fFile<<"File: "<<File<<endl;fFile<<"Line: "<<Line<<endl;fFile<<"Exe: "<<g_wsFileName.c_str()<<endl<<endl;fFile<<"******************** Error ********************"<<endl<<endl;fFile.close();g_bIsOpen = FALSE;delete[] pwszMsg;}//**************************************************////fun:輸出錯誤記錄檔////pa:Func函數名//File檔案名稱//Line行號//ErrCode錯誤碼//Msg流程日誌資訊////**************************************************VOID LogError( CHAR* Func, CHAR* File, DWORD Line, DWORD ErrCode, const WCHAR* Msg, ... ){while ( g_bIsOpen ){Sleep(10);}g_bIsOpen = TRUE;LogInit();WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );va_list ArgsList;va_start( ArgsList, Msg );vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );va_end( ArgsList );string sMsg = ToStr( pwszMsg );fstream fFile;fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );fFile<<"******************** Error ********************"<<endl<<endl;fFile<<sMsg.c_str()<<endl;fFile<<"Code: "<<ErrCode<<endl<<endl;fFile<<"Fun: "<<Func<<endl;fFile<<"File: "<<File<<endl;fFile<<"Line: "<<Line<<endl;fFile<<"Exe: "<<g_wsFileName.c_str()<<endl<<endl;fFile<<"******************** Error ********************"<<endl<<endl;fFile.close();g_bIsOpen = FALSE;delete[] pwszMsg;}//**************************************************////fun:將Unicode字串轉換為UTF-8字串////pa:Func函數名//File檔案名稱//Line行號//Msg流程日誌資訊////**************************************************std::string ToStr( wstring WStr ){DWORD dwStrlen = WideCharToMultiByte( CP_ACP, 0, WStr.c_str(), -1, NULL, 0, NULL, NULL );CHAR* pDest = new CHAR[dwStrlen];dwStrlen = WideCharToMultiByte( CP_ACP, 0, WStr.c_str(), -1, pDest, dwStrlen, NULL, NULL );string sRes = pDest;delete[] pDest;return sRes;}