让 win32 程序也可以从 console 输出信息
今天同事在调试一个 win32 程序的时候,希望从 console 输出一些调试信息。他威胁说,否则,就要动用邪恶的 MessageBox 了。
我们以前的库倒是提供了一个 console 模块,可以从 win32 程序中创建出一个 console 。然后把标准输入输出定向到上面。这并不麻烦,就算不用翻出以前的代码重用一下,查下 MSDN 自己写上几句也可以解决。
今天突然想到,其实还有一个更 kiss 的解决方法。那就是直接开一个 console ,再在上面执行需要调试的程序。只不过直接运行是不会得到任何输出的,需要多做一步的是使用管道操作。
例如,需要调试的程序是 test ,那么只需要写 test | more 就可以把 test 的标准输出导向 more ,那么 more 就能捕获所有 test 的标准输出并显示在控制台上了。
Comments
方法有不少,但重定义输出流比较好.因为原有代码中或一些库中很可能有printf来输出一些错误信息.
而库中的代码又是不希望改动的.那只能重定义输入输出了.
Posted by: Peter | (13) August 18, 2008 03:02 PM
使用AllocConsole,在重定向标准输出流就可以了。
代码可以写成一个类,并放在一个.cpp文件中,并在.cpp中定义一个这个类的全局变量。
要想使用这个Console输出功能,把这个.cpp加到工程就好了。
一劳永逸。
Posted by: gobr | (12) August 26, 2007 07:17 PM
SendMessage WM_COPYDATA
自己再做一个接受的程序,很简单,而且自己想怎样处理都行。
Posted by: hppychui | (11) January 29, 2007 10:37 AM
AllocConsole();
stdout = freopen("CONOUT$", "w" stdout);
printf("hello, world.\n");
Posted by: chen3feng | (10) January 19, 2007 12:55 AM
MessageBox()也不错 哈哈
Posted by: dreamsun | (9) January 17, 2007 04:46 PM
嘻嘻,还是outputdebugstring方便,很多工具还有过滤功能,只查看要关注的信息。
Posted by: sunway | (8) January 17, 2007 01:13 PM
console的buffer大小是可以改的,我一般设置成1000行,另外利用重定向功能还可以把log输出到文件里去。test >> log.txt
to ai: 自己去试验一下就知道了。
Posted by: analyst | (7) January 16, 2007 11:53 PM
more 会等待用户输入,但是不影响运行的进程。
反而直接用 console ,一旦输出过多超过 buffer 限制,则有可能漏掉需要的信息。
如果不喜欢 more ,可以自己写一个合适的工具,或者装个 cygwin 什么的。
Posted by: Cloud | (6) January 16, 2007 10:29 PM
to analyst:
当把 subsystem选成console,在写个main后,原来的Win32 窗口程序还能运行吗?可不可以同时运行WIN32窗口程序时,在打开一个console输出调试信息?谢谢
Posted by: ai | (5) January 16, 2007 10:24 PM
不对啊,用more的话一屏显示满了就会停下来等待用户输入才会继续显示,使用不方便
Posted by: analyst | (4) January 16, 2007 10:18 PM
以下方法皆可,也都用过。但是觉得还是用管道最为方便。什么多余的工作都不用做。
Posted by: Cloud | (3) January 16, 2007 07:17 PM
outputdebugstring()...
然后去找个DebugView工具。
Posted by: sunway | (2) January 16, 2007 05:31 PM
可以在DEBUG版里把连接选项里面把subsystem选成console,再写个main入口函数就可以了,我现在都用console窗口输出调试信息。
Posted by: analyst | (1) January 16, 2007 05:15 PM