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

标签 c++ dll mfc console stdio

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

听起来很简单,是吧?好吧,经过几个小时的互联网搜索并实现了多种解决方案后,我感到很惊讶,但都没有奏效!

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

据我所知,任何应用程序(包括所有以任何方式加载的 dll)都有单一的标准输出流(单一的标准输入和单一的标准错误)。那时事情对我来说太复杂了。我试图重定向这个标准输出流(显然,对于整个应用程序/进程)并且在某些情况下它适用于我的 dll,但它仍然不适用于 EXTERNAL dll。 IE。如果我使用类似 cout << "Hey!"; 的东西从我的 dll 中,我可以在我将流重定向到的文件中看到这个。但是,来自外部 dll 内部的相同调用(是的,我有它的来源,但我真的不想更改它们)没有任何作用。天知道这个输出是在哪里完成的。

我试过:

  1. 好老freopen()诡计。对我的 dll 有效,对外部 dll 无效。
  2. WinAPI SetStdHandle()称呼。根本不起作用。似乎在使用 Win7 时遇到了一些问题。
  3. AllocConsole() + _open_osfhandle() .同1。看我在控制台的输出,看不到外部dll的输出。
  4. cout.rdbuf()重新分配。与 3 相同,但仅适用于 cout。

好吧,伙计们,我真的需要帮助。好像我被卡住了:-/

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

最佳答案

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

关于c++ - 重定向 MFC GUI 应用程序中使用的 c++ dll 的控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4397345/

相关文章:

c++ - 创建并检查点是否在多边形内

.net - 当从非 F# 应用程序使用 F# 制作的 DLL 引用 Fsharp.Core v4.4.1.0 时找不到文件

c# - 应用程序的强名称验证失败

c++ - Project Euler #8,我不明白我哪里出错了

c++ - 在 perl 中调试由 SWIG 包装的共享库

android - android设备上二进制文件损坏的可能原因是什么

c++ - Visual Studio 2008 发布版本不修饰 DLL 导出

c++ - DirectShow - 无法创建新线程

c++ - 无法将 lpCmdLine 参数分配给 char* 指针

c++ - 从 MFC CDialog 上的子控件接收 WM_MOUSEMOVE