重定向c+的控制台输出+;mfcgui应用程序中的dll 我有一个C++ DLL通过控制台输出使用PROTF或COUT报告很多有用的信息。我正在将此dll链接到用MFC编写的GUI应用程序,并希望访问其输出

重定向c+的控制台输出+;mfcgui应用程序中的dll 我有一个C++ DLL通过控制台输出使用PROTF或COUT报告很多有用的信息。我正在将此dll链接到用MFC编写的GUI应用程序,并希望访问其输出,c++,dll,mfc,console,stdio,C++,Dll,Mfc,Console,Stdio,听起来很简单,是吗?好吧,我很惊讶,在数小时的互联网搜索和实施几个解决方案后,它们都不起作用 所以可能需要一些关于应用程序的附加信息。我有一个巨大的主机应用程序,我无法访问它。事实上,我正在给它写插件。它在运行时链接我的插件dll(我想是使用LoadLibrary()。我的dll使用我想要获取的外部dll输出。这个dll通过相应的lib文件静态链接到我的,所以CRT完成所有的加载 据我所知,任何应用程序(包括所有以任何方式加载的dll)都有一个标准输出流(单标准输入和单标准输出)。那时候事情对我

听起来很简单,是吗?好吧,我很惊讶,在数小时的互联网搜索和实施几个解决方案后,它们都不起作用

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

据我所知,任何应用程序(包括所有以任何方式加载的dll)都有一个标准输出流(单标准输入和单标准输出)。那时候事情对我来说太复杂了。我已经尝试重定向这个标准输出流(显然,对于整个应用程序/进程),在某些情况下它对我的dll有效,但对于外部dll仍然不起作用。也就是说,如果我使用类似于
cout的东西,你试过了吗?MSDN文档中的示例演示了如何重定向
stdout
。(我不知道这在Windows中是在库级还是在操作系统级起作用,因此它可能不适用于整个过程。)


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

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

您最好的选择可能是
SetStdHandle()
-什么东西不能使用它?您是否收到任何错误?如果不是从您链接到的命令提示符有趣线程启动GUI应用程序,则默认情况下Win7下没有std句柄-但是这是一个未解析的msdn论坛线程,因此没有明确的信息。另外:您的评论说“默认情况下没有std句柄”,msdn论坛线程似乎暗示SetStdHandle在Win7/no控制台下根本不工作!哦,伙计,这真的很有帮助!太神奇了!但是正如我所说的,我既不能更改主机应用程序也不能更改外部dll(我已经在单独的repo项目中测试了您的建议),而且它们都有“MFC Static”。有没有工作机会?。这是工作机会。没有,我不知道。为什么你根本不能改变来源?愚蠢的经理?如果他们想要完成工作,他们必须为你提供完成工作的方法。对他们施加一些反压力,解释没有这个微小的变化是不可能的。我已经深入研究了这个问题。事实证明,不仅MFC设置起作用。此外,CRT必须设置为/MD模式(多线程DLL)。我们的策略是将此设置始终设置为/MT(多线程)。改变这一点会降低应用程序的可移植性。首先,它会使您的应用程序实际工作。“可移植”应用程序如果不起作用,则毫无用处。其次,您可以始终使用运行时DLL和/或运行时库的可再发行文件分发应用程序。您的“可移植性”参数无效。因此您坚持认为有必要使用/MD。好的,明白了。谢谢