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

在写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);

}

猜你喜欢

转载自blog.csdn.net/timeinsist/article/details/78453396