在写windows窗体程序的时候,特别是服务器调试,又不能断点的情况下,我们希望输出信息以供我们定位错误信息,经常的做法是输出日志,但是输出日志过大,日志文件过大,会降低服务器的性能,甚至造成卡死状态(非异步模式读写文件),因此我们可以通过从dos窗口输出程序,来达到我们的要求
class CDebugWindow
{
//唯一实例
private:
explicit CDebugWindow();
explicit CDebugWindow(TCHAR *Title);
public:
static CDebugWindow& GetInstance();
static void DestroyInstance();
~CDebugWindow();
//对外接口
public:
#define DbgEndl "\n"
template<class T>
CDebugWindow& operator<<(T info) { WriteInfo(info); return *this; };
//模板特例化
template<class T>
CDebugWindow& operator<<(T* info) { WriteInfo(info); return *this; };
template<class T>
CDebugWindow& operator<<(const T* info) { WriteInfo(info); return *this; };
private:
wstring GetTime();
HANDLE Alloc();
bool Free();
bool WriteInfo(const TCHAR *szInfo);
bool WriteInfo(const char *szInfo);
bool WriteInfo(float fNum);
bool WriteInfo(int nNum);
bool WriteInfo(long lNum);
bool WriteInfo(double dNum);
bool WriteInfo(__int64 llNum);
private:
HANDLE m_hConsole;
static CDebugWindow* si_Instance;
static int m_nInstanceNum;
};
#include "stdafx.h"
#include "DebugWindow.h"
#include "ConvertChar.h"
int CDebugWindow::m_nInstanceNum = 0;
CDebugWindow* CDebugWindow::si_Instance = NULL;
CDebugWindow::CDebugWindow()
{
Alloc();
::SetConsoleTitle(TEXT("调试窗口"));
}
CDebugWindow::CDebugWindow(TCHAR *Title)
{
Alloc();
::SetConsoleTitle(TEXT("Title"));
}
CDebugWindow& CDebugWindow::GetInstance()
{
if (!m_nInstanceNum)
{
si_Instance = new CDebugWindow();
++m_nInstanceNum;
return *si_Instance;
}
else
{
++m_nInstanceNum;
return *si_Instance;
}
}
void CDebugWindow::DestroyInstance()
{
if (--m_nInstanceNum)
{
delete si_Instance;
}
}
CDebugWindow::~CDebugWindow()
{
Free();
}
HANDLE CDebugWindow::Alloc()
{
if (::AllocConsole())
{
m_hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
return m_hConsole;
}
return NULL;
}
bool CDebugWindow::Free()
{
return ::FreeConsole();
}
bool CDebugWindow::WriteInfo(const TCHAR *szInfo)
{
DWORD nNumWritten = 0;
std::wstring szBuf = szInfo;
return ::WriteConsole(m_hConsole, szBuf.data(), szBuf.size(), &nNumWritten, NULL);
}
bool CDebugWindow::WriteInfo(const char *szInfo)
{
DWORD nNumWritten = 0;
WCHAR szTemp[255] = L"";
CConvertChar::AnsiToUnicode(szTemp, szInfo);
std::wstring szBuf = szTemp;
return ::WriteConsole(m_hConsole, szBuf.data(), szBuf.size(), &nNumWritten, NULL);
}
bool CDebugWindow::WriteInfo(int nNum)
{
DWORD nNumWritten = 0;
TCHAR szInfo[16];
swprintf(szInfo, 16 ,TEXT("%d"), nNum);
std::wstring szBuf = szInfo;
return ::WriteConsole(m_hConsole, szBuf.data(), szBuf.size(), &nNumWritten, NULL);
}
bool CDebugWindow::WriteInfo(long lNum)
{
DWORD nNumWritten = 0;
TCHAR szInfo[16];
swprintf(szInfo,16 ,TEXT("%ld"), lNum);
std::wstring szBuf = szInfo;
return ::WriteConsole(m_hConsole, szBuf.data(), szBuf.size(), &nNumWritten, NULL);
}
bool CDebugWindow::WriteInfo(float fNum)
{
DWORD nNumWritten = 0;
TCHAR szInfo[16];
swprintf(szInfo, 16,TEXT("%f"), fNum);
std::wstring szBuf = szInfo;
return ::WriteConsole(m_hConsole, szBuf.data(), szBuf.size(), &nNumWritten, NULL);
}
bool CDebugWindow::WriteInfo(double dNum)
{
DWORD nNumWritten = 0;
TCHAR szInfo[16];
swprintf(szInfo,16,TEXT("%lf"), dNum);
std::wstring szBuf = szInfo;
return ::WriteConsole(m_hConsole, szBuf.data(), szBuf.size(), &nNumWritten, NULL);
}
bool CDebugWindow::WriteInfo(__int64 llNum)
{
DWORD nNumWritten = 0;
TCHAR szInfo[16];
swprintf(szInfo, 16, TEXT("%I64d"), llNum);
std::wstring szBuf = szInfo;
return ::WriteConsole(m_hConsole, szBuf.data(), szBuf.size(), &nNumWritten, NULL);
}
wstring CDebugWindow::GetTime()
{
time_t timeStamp = time(NULL);
tm curTime;
localtime_s(&curTime,&timeStamp);
TCHAR szBuf[64] = TEXT("");
wcsftime(szBuf, 64, TEXT("[%Y-%m-%d %H:%M:%S] "), &curTime);
return wstring(szBuf);
}