« 3D engine ,中间层的缺失 | 返回首页 | 从 Command 模式看 C++ 之缺陷 »

让 win32 程序也可以从 console 输出信息

今天同事在调试一个 win32 程序的时候,希望从 console 输出一些调试信息。他威胁说,否则,就要动用邪恶的 MessageBox 了。

我们以前的库倒是提供了一个 console 模块,可以从 win32 程序中创建出一个 console 。然后把标准输入输出定向到上面。这并不麻烦,就算不用翻出以前的代码重用一下,查下 MSDN 自己写上几句也可以解决。

今天突然想到,其实还有一个更 kiss 的解决方法。那就是直接开一个 console ,再在上面执行需要调试的程序。只不过直接运行是不会得到任何输出的,需要多做一步的是使用管道操作。

例如,需要调试的程序是 test ,那么只需要写 test | more 就可以把 test 的标准输出导向 more ,那么 more 就能捕获所有 test 的标准输出并显示在控制台上了。

Comments

方法有不少,但重定义输出流比较好.因为原有代码中或一些库中很可能有printf来输出一些错误信息.
而库中的代码又是不希望改动的.那只能重定义输入输出了.

使用AllocConsole,在重定向标准输出流就可以了。

代码可以写成一个类,并放在一个.cpp文件中,并在.cpp中定义一个这个类的全局变量。

要想使用这个Console输出功能,把这个.cpp加到工程就好了。

一劳永逸。

SendMessage WM_COPYDATA
自己再做一个接受的程序,很简单,而且自己想怎样处理都行。

AllocConsole();
stdout = freopen("CONOUT$", "w" stdout);
printf("hello, world.\n");

MessageBox()也不错 哈哈

嘻嘻,还是outputdebugstring方便,很多工具还有过滤功能,只查看要关注的信息。

console的buffer大小是可以改的,我一般设置成1000行,另外利用重定向功能还可以把log输出到文件里去。test >> log.txt

to ai: 自己去试验一下就知道了。

more 会等待用户输入,但是不影响运行的进程。

反而直接用 console ,一旦输出过多超过 buffer 限制,则有可能漏掉需要的信息。

如果不喜欢 more ,可以自己写一个合适的工具,或者装个 cygwin 什么的。

to analyst:
当把 subsystem选成console,在写个main后,原来的Win32 窗口程序还能运行吗?可不可以同时运行WIN32窗口程序时,在打开一个console输出调试信息?谢谢

不对啊,用more的话一屏显示满了就会停下来等待用户输入才会继续显示,使用不方便

以下方法皆可,也都用过。但是觉得还是用管道最为方便。什么多余的工作都不用做。

outputdebugstring()...
然后去找个DebugView工具。

可以在DEBUG版里把连接选项里面把subsystem选成console,再写个main入口函数就可以了,我现在都用console窗口输出调试信息。

Post a comment

非这个主题相关的留言请到:留言本