代码鄙陋,莫要见笑。
/**********************************************************************************************
功能:打开控制台窗口,方便用cout,pintf等输出调试信息;
说明:注释掉宏SHOW_WIN32CONSOLE_INCONSOLE取消控制台输出
(此宏作用于①init函数默认状态,②自动打开Console窗口全局变量g_AutoOpenConsole)
使用:将以下代码保存成.h头文件,然后只需Win32工程中包含此头文件,程序启动时就会自动打开Console窗口。
如果需要手动通过CWin32Console::init, CWin32Console::open, CWin32Console::close开闭Console窗口(),
可以注释掉下边代码static CWin32Console g_AutoOpenConsole********;
控制console开闭的方法可以灵活使用。
注意:最好用pintf函数输出信息!
如果用cout进行输出,那么在调用CWin32Console类的Close()成员函数后再次调用
Open()成员函数,可能cout就不会再输出信息;
***********************************************************************************************/
#ifndef ___Win32Console__HH__
#define ___Win32Console__HH__
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#pragma warning(disable:4311)
//注释掉宏SHOW_WIN32CONSOLE_INCONSOLE取消控制台输出
#define SHOW_WIN32CONSOLE_INCONSOLE
class CWin32Console
{
public:
//非常规做法,抑制代码使用者生成此类的对象
CWin32Console(int iMode,int,int,int,int,int,int,int ,char*,char*,char*,char*,char*,char*,char*,char*)
{
if (iMode == 0)
{
#ifdef SHOW_WIN32CONSOLE_INCONSOLE
FreeConsole();
if ( AllocConsole() )
{
static long g_lConsole = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
*stdout = *(::_fdopen(g_lConsole, "w"));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(g_lConsole, "w"));
::setvbuf(stderr, NULL, _IONBF, 0);
}
#endif
}
else
{
open();
}
}
private:
CWin32Console(void)
{
FreeConsole();
if ( AllocConsole() )
{
static long g_lConsole = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
*stdout = *(::_fdopen(g_lConsole, "w"));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(g_lConsole, "w"));
::setvbuf(stderr, NULL, _IONBF, 0);
}
}
public:
~CWin32Console(void)
{
}
public:
//i!=0时强制开启():不受SHOW_Win32Console_INCONSOLE限制,等同于Open
//如果不强制开启,那么一旦调用了close就必须调用Open才能再次打开
static int init(int i = 0)
{
if (i == 0)
{
#ifdef SHOW_WIN32CONSOLE_INCONSOLE
static CWin32Console Cons;
#endif
}
else
{
open();
}
return 0;
}
static void open()
{
FreeConsole();
if ( AllocConsole() )
{
static long g_lConsole = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
*stdout = *(::_fdopen(g_lConsole, "w"));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(g_lConsole, "w"));
::setvbuf(stderr, NULL, _IONBF, 0);
}
}
static void WndTopMost(BOOL bTopMost = TRUE)
{
if (bTopMost)
{
HANDLE g_lConsole = GetConsoleHwnd();
::SetWindowPos((HWND)g_lConsole, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
else
{
HANDLE g_lConsole = GetConsoleHwnd();
::SetWindowPos((HWND)g_lConsole, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
}
static void close()
{
FreeConsole();
}
private:
static HWND GetConsoleHwnd()
{
HWND hwndFound;
char pszNewWindowTitle[1024] = {0};
char pszOldWindowTitle[0124] = {0};
GetConsoleTitle(pszOldWindowTitle, 1024);
wsprintf(pszNewWindowTitle,"%d/%d",
GetTickCount(),
GetCurrentProcessId());
SetConsoleTitle(pszNewWindowTitle);
Sleep(500);
hwndFound=FindWindow(NULL, pszNewWindowTitle);
SetConsoleTitle(pszOldWindowTitle);
return(hwndFound);
}
};
//定义此对象自动启动Console窗口
static CWin32Console g_AutoOpenConsole(0,435,43,23,33,0x33333,0xff,0,0,0,0,0,0,0,0,0);
#endif
本文介绍如何在Win32应用程序中利用Console窗口进行调试信息的输出,通过简单的方法实现程序运行过程中的日志打印。

1130

被折叠的 条评论
为什么被折叠?



