在windows窗体程序中单独开一个dos命令行窗口,输出我们想要的信息(调试程序常用)

来源:互联网 发布:js防水涂料 速溶自粘 编辑:程序博客网 时间:2024/04/30 00:44

在写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);}
阅读全文
0 0
原创粉丝点击