码迷,mamicode.com
首页 > Windows程序 > 详细

[Windows]_[中级]_[界面程序打开控制台输出-转发输出到控制台]

时间:2015-05-10 01:04:44      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:windows   界面程序   控制台输出   dll   转发   

场景:

1. 开发Windows界面程序时,需要打印输出,断点在调试多线程程序有局限性,就是会干扰线程的优先顺序,看不到正确的结果,往往就是断点就没事,

没断点程序就不能正常运行了。

2. 使用动态库(静态库)时,出现问题时在Dll里写std::cout输出信息是必不可少的调试方法,特别对于多线程程序,谁先谁后暂停后的结果就会不一样了。

有时候没有动态库的代码时,也没法对动态库打断点。 

3.  打开控制台窗口后只能看到WIndows程序的输出而无法看到Dll的输出?

4. 直接改配置属性-》链接器-》子系统为 控制台 (/SUBSYSTEM:CONSOLE) 是不现实的,因为我们开发的是界面程序。


方法1, 在输出窗口查看打印日志,使用函数:

void WINAPI OutputDebugString(
  __in_opt  LPCTSTR lpOutputString
);


方法2, 像Console程序那样打开控制台窗口,不需要OutputDebugString,为了查看std::cout, printf输出, 添加代码:

static void OpenConsole()
{
	AllocConsole();  
	HANDLE   handle   =   GetStdHandle(STD_OUTPUT_HANDLE);    
	int   hCrt   =   _open_osfhandle((long)handle,_O_TEXT);    
	FILE   *   hf   =   _fdopen(   hCrt,   "w"   );    
	*stdout   =   *hf;    
}
在 _tWinMain 的开始调用

#ifdef _DEBUG
	OpenConsole();
#endif


结束时调用

#ifdef _DEBUG
	FreeConsole();
#endif

问题来了


我们自己写的Dll库里写的std::cout输出并没有打印出来?

原因就是Dll和Windows使用的不是同一个运行时库,所以导致OpenConsole()对动态库无效.

解决办法就是有2个步骤要确认,界面和动态库都需要同样的配置

1. 配置属性-》常规-》MFC的使用: 在共享DLL中使用MFC

技术分享

2. 配置属性-》C/C++ -》代码生成-》多线程调试 DLL(/MDd)

技术分享



现在已经可以在控制台看到DLL的输出了,解决,不谢.^-^


参考:

Redirecting console output of c++ dll used in MFC GUI application




[Windows]_[中级]_[界面程序打开控制台输出-转发输出到控制台]

标签:windows   界面程序   控制台输出   dll   转发   

原文地址:http://blog.csdn.net/infoworld/article/details/45607797

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!