重定向MFC GUI应用程序中使用的c ++ dll的控制台输出

时间:2010-12-09 10:44:32

标签: c++ dll mfc console stdio

我有一个C ++ DLL通过使用printf或cout的控制台输出报告了大量有用的信息。我将此dll链接到我在MFC中编写的GUI应用程序,并希望访问其输出。

听起来很简单,是吗?好吧,经过几个小时的互联网搜索并实施了几个解决方案后,我感到很惊讶!

因此,可能需要一些有关应用程序的其他信息。我有一个巨大的主机应用程序,我无法访问。实际上,我正在编写插件。它在运行时链接我的插件dll(我猜想使用LoadLibrary())。我的dll反过来使用外部dll我想要获取的输出。这个dll通过相应的lib文件链接到我的静态链接,因此CRT会完成所有加载。

据我所知,任何应用程序(包括所有以任何方式加载的dll)都有单个stdout流(单个stdin和单个stderr)。而那时候事情对我来说太复杂了。我试图重定向这个stdout流(显然,对于整个应用程序/进程),在某些情况下它适用于我的DLL,但它仍然不适用于EXTERNAL DLL。即如果我从我的dll中使用类似cout << "Hey!";的内容,我可以在文件中看到我重定向的流。但是,来自外部dll的同一个调用(是的,我有它的来源,但我真的不想改变它们)什么都不做。上帝知道这个输出在哪里完成。

我试过了:

  1. 好老freopen()招数。为我的dll工作,对外部DLL没有任何影响。
  2. WinAPI SetStdHandle()致电。根本不起作用。似乎在Win7上遇到了一些麻烦。
  3. AllocConsole() + _open_osfhandle()。与1.在控制台中查看我的输出,看不到外部dll的输出。
  4. cout.rdbuf()重新分配。与3相同,但仅适用于cout。
  5. 好吧,伙计们,我真的需要帮助。好像我被卡住了: - /

    其他信息:
    主机应用程序,我的DLL和外部DLL是使用MSVS'05开发的。所有dll都具有“在静态库中使用MFC”设置。测试在Win7 x64下完成。我确实拥有所有来源,但我无权更改它们。

2 个答案:

答案 0 :(得分:1)

您正在通过“在静态库中使用MFC”设置搞砸了IIRC。设置/重新打开int(POSIX样式)句柄将不起作用,因为您的DLL和您的应用程序都使用不同的/独立的运行时库。解决方案:使用“在共享DLL中使用MFC”设置。在Windows上使用静态运行时库因为这种问题而被延迟了。

答案 1 :(得分:0)

你试过_dup2吗? MSDN文档中的示例显示了如何重定向stdout。 (我不知道这是否适用于Windows级别的库或操作系统级别,因此它可能不适用于整个过程。)

当然,DLL也可能正在写入stderr