我的日志记录组件

和大家分享下我写的日志记录文件组件。下面是一些定义和调用的封装。如存在bug,欢迎指正。

如需要demo程序和组件可去我在csdn下的下载资源或是去风华软件在线(www.fhuasoft.cn)网站上去下载。

//下面是定义文件

#ifndef _DEBUG_TRACE_2004
#define _DEBUG_TRACE_2004

#include <atlbase.h>
#include "logdeal.h"

#define DOUT_FILE 0x0001 //将调试信息输出到文件中去
#define DOUT_VIEW 0x0002 //将调试信息输出到DebugView中去
#define DOUT_ALL 0xffff //将调试信息发到所有接受调试信息的模块中去

class CLog
{
public:
 CLog();
 ~CLog();

 static CLog* Create();
 BOOL Trace(BSTR s);
 void AddRef();
 void Release();
private:
 CComPtr<ILOG>m_pLog;
 static CLog *plog;

 DWORD m_dwRef;
 CRITICAL_SECTION m_cr;
};

#define DEBUG_TRACE
#ifdef DEBUG_TRACE
 BOOL DebugTrace(LPCTSTR lpszFormat,...);
 BOOL DLOGTrace(LPCTSTR lpszFormat,...);
 BOOL DTrace(int, LPCTSTR lpszFormat,...);
 #define DG DTrace 
 #define DT DebugTrace
 #define _DT DEBUG_TRACE
#else
 #define DT
 #define DG
 #undef _DT
#endif

#endif

//下面是实现文件

#include "stdafx.h"
#include <AFXPRIV.H>
#include "DT.h"

 

#ifdef DEBUG_TRACE
BOOL DebugTrace(LPCTSTR lpszFormat,...)
{
 ASSERT(AfxIsValidString(lpszFormat));
 
 static HWND hwnd = ::FindWindowA(NULL, "DbgView");
 if(!IsWindow(hwnd))
  hwnd = ::FindWindowA(NULL, "DbgView");

 if(hwnd)
 {
  CString szMsg;

  va_list argList;
  va_start(argList, lpszFormat);
  try
  {
   szMsg.FormatV(lpszFormat, argList);
  }
  catch(...)
  {
   szMsg = "DebugHelper输出字符串格式错误!";
  }
  va_end(argList);
  DWORD dwId = GetCurrentProcessId();
  ::SendMessage(hwnd,WM_SETTEXT,dwId,(LPARAM)(LPCTSTR)szMsg);
  return TRUE;
 }
 return FALSE;
}
BOOL DLOGTrace(LPCTSTR lpszFormat,...)
{
 ASSERT(AfxIsValidString(lpszFormat));
 
 {
  CString szMsg;

  va_list argList;
  va_start(argList, lpszFormat);
  try
  {
   szMsg.FormatV(lpszFormat, argList);
  }
  catch(...)
  {
   szMsg = "DebugView输出字符串格式错误!";
  }
  va_end(argList);
  CLog *log = CLog::Create();
  log->Trace(szMsg.AllocSysString());
  log->Release();
  return TRUE;
 }
 return FALSE;
}

BOOL DTrace(int ntype, LPCTSTR lpszFormat,...)
{
 static int nt = -1;
 if(nt < 0);

 if(ntype & DOUT_FILE)
  DLOGTrace(lpszFormat);
 if(ntype & DOUT_VIEW)
  DebugTrace(lpszFormat);

 return TRUE;
}
#endif

#include "logdeal_i.c"
CLog *CLog::plog = NULL;
CLog::CLog()
{
 CoInitialize(NULL);
 ::CoCreateInstance(CLSID_LOG  , NULL, CLSCTX_INPROC, IID_ILOG,
  (void **)&m_pLog);
 plog = NULL;

 InitializeCriticalSection(&m_cr);
 //取文件名
 TCHAR buf[MAX_PATH] ={0};
 TCHAR *s;
 TCHAR str[MAX_PATH] = {0};
 GetModuleFileName(NULL, buf, MAX_PATH);
 s = _tcsrchr(buf, '//');
 _tcsncpy(str, buf, _tcslen(buf) - _tcslen(s));
 SYSTEMTIME t;
 GetSystemTime(&t);
 _stprintf(buf, "//%02d%02d%02d%02d%02d%02d%", t.wYear, t.wMonth, t.wDay,
  t.wHour, t.wMinute, t.wSecond);
 _tcscat(str, buf);
 _tcscat(str, _T(".txt"));
 USES_CONVERSION;
 if(m_pLog)
  m_pLog->SetFile(T2W(str));
 m_dwRef = 0;
}
CLog::~CLog()
{
 if(m_pLog)
 {
  m_pLog.Release();
 }
 ::CoUninitialize();
//  if(CLog::m_pLog)
}
CLog *CLog::Create()
{
 if(plog == NULL)
 {
  plog = new CLog();
 }
 plog->AddRef();
 return plog;
}
void CLog::AddRef()
{
 EnterCriticalSection(&m_cr);
 m_dwRef ++;
 LeaveCriticalSection(&m_cr);
}
void CLog::Release()
{
 EnterCriticalSection(&m_cr);
 m_dwRef --;
 if(m_dwRef == 0)
 {
  DeleteCriticalSection(&m_cr);
  delete plog;
 }
 else
  LeaveCriticalSection(&m_cr);
}
BOOL CLog::Trace(BSTR s)
{
 if(plog && m_pLog)
 {
  EnterCriticalSection(&m_cr);
  HRESULT hr = m_pLog->Trace(s) ;
  LeaveCriticalSection(&m_cr);

  return hr == S_OK;
 }
 return FALSE;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值