Contents

MFC窗体程序弹出命令行窗口显示日志输出

如何让MFC窗体程序弹出命令行窗口并打印日志输出

习惯了linux上运行程序时在terminal中查看打印的日志. 但在MFC窗口程序中却不行. 折腾了一下, 结果如下

弹出命令行窗口

在主程序的XXX::InitInstance()函数中添加

1
2
3
4
#ifdef _DEBUG
	if (!AllocConsole())
		AfxMessageBox("Failed to create the console!", MB_ICONEXCLAMATION);
#endif

在对应的XXX::ExitInstance()中添加

1
2
3
4
#ifdef _DEBUG
	if (!FreeConsole())
		AfxMessageBox("Could not free the console!");
#endif

这样在DEBUG模式下启动程序时, 会弹出命令行窗口

打印日志(含文件名, 代码行号)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

#define LOG2CONSOLE(X)												\
{																	\
	std::string file = __FILE__;									\
	size_t index;													\
	for (index = file.size()-1; index > 0; index--) {				\
		if (file[index] == '\\') break;								\
	}																\
	std::string  fileName = file.substr(index + 1);					\
	std::stringstream ss;											\
	ss << X;														\
	std::string s = ss.str();										\
	_cprintf("%s:%i %s\n", fileName.c_str(), __LINE__, s.c_str());	\
}

1, 注意要使用宏, 而不是函数, 否则代码文件名和代码行始终是定义的位置

2, 宏换行的话, 除了最后一个大括号, 每一行后面都要接一个 \

使用

1
LOG2CONSOLE("[Clicked] my button clicked. the xxx value is:" << something);

使用printf

上面的宏中使用的是 _cprintf, 我发现在某些时候, 即便输出的是ascii字符, 也会出现乱码. 改成printf又打印不出来, 为了让printf能打印出来,

修改:

1
2
3
4
#ifdef _DEBUG
	if (!AllocConsole())
		AfxMessageBox("Failed to create the console!", MB_ICONEXCLAMATION);
#endif

1
2
3
4
5
6
#ifdef _DEBUG
	AllocConsole();
	//freopen("CONIN$", "r", stdin);
	freopen("CONOUT$", "w", stdout);
	freopen("CONOUT$", "w", stderr);
#endif