Win32应用程序使用Console窗口输出调试信息

本文介绍如何在Win32应用程序中利用Console窗口进行调试信息的输出,通过简单的方法实现程序运行过程中的日志打印。

代码鄙陋,莫要见笑。


/**********************************************************************************************

功能:打开控制台窗口,方便用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值