【问题标题】:Redirecting console output of c++ dll used in MFC GUI application重定向 MFC GUI 应用程序中使用的 c++ dll 的控制台输出
【发布时间】:2011-05-22 19:01:07
【问题描述】:

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

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

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

据我所知,任何应用程序(包括所有以任何方式加载的 dll)都具有单个标准输出流(单个标准输入和单个标准错误)。那时事情对我来说太复杂了。我试图重定向这个标准输出流(显然,对于整个应用程序/进程),在某些情况下它适用于我的 dll,但它仍然不适用于外部 dll。 IE。如果我从我的dll中使用cout << "Hey!";之类的东西,我可以在我重定向流的文件中看到它。但是,来自外部 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 下进行的。我确实拥有所有来源,但我无权更改它们。

【问题讨论】:

  • 您最好的选择可能是SetStdHandle() - 究竟是什么不适合它?你有任何错误吗?
  • 如果不是从命令提示符social.msdn.microsoft.com/forums/en-us/…启动,则在Win7下GUI应用程序默认没有std句柄@
  • 您链接到的有趣线程 - 但是这是一个未解决的 msdn 论坛线程,因此从那里没有明确的信息。另外:您的评论说“默认情况下没有 std 句柄”,msdn 论坛帖子似乎暗示 SetStdHandle 根本无法在 Win7/无控制台下工作!

标签: c++ dll mfc console stdio


【解决方案1】:

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

【讨论】:

  • 哦,伙计,这真的很有帮助!太奇妙了!但是...正如我所说,我既不能更改主机应用程序也不能更改外部 dll(我已经在单独的 repro-project 中测试了您的建议),并且它们都具有“MFC 静态”。有没有变通的机会?..
  • 这是解决方法。不,我不知道。为什么你根本不能改变来源?愚蠢的管理者?如果他们想要完成工作,他们必须为您提供完成工作的方法。给他们一些背压,解释说没有这个微小的改变是不可能的。
  • 我已经深入研究了这个问题。事实证明,不仅 MFC 设置可以解决问题。 CRT 也必须设置为 /MD 模式(多线程 DLL)。我们对此设置的政策始终为 /MT(多线程)。更改此内容将使应用程序的可移植性降低。
  • 首先,它将使您的应用程序真正工作。 “便携式”应用程序如果不工作就毫无用处。其次,您始终可以使用运行时 DLL 和/或运行时库的可再发行文件分发您的应用程序。您的“可移植性”论点无效。
  • 所以你坚持必须使用 /MD。好的,明白了。谢谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多