我有一个 C++ dll,它使用 printf 或 cout 通过控制台输出报告大量有用信息。我正在将此 dll 链接到我用 MFC 编写的 GUI 应用程序,并想访问它的输出。
听起来很简单,是吧?好吧,经过几个小时的互联网搜索并实现了多种解决方案后,我感到很惊讶,但都没有奏效!
所以可能需要一些关于应用程序的额外信息。我有一个我无权访问的大型主机应用程序。实际上,我正在为其编写插件。它在运行时链接我的插件 dll(我想是使用 LoadLibrary())。我的 dll 依次使用我想要获取的输出的外部 dll。此 dll 通过相应的 lib 文件静态链接到我的,因此 CRT 完成所有加载。
据我所知,任何应用程序(包括所有以任何方式加载的 dll)都有单一的标准输出流(单一的标准输入和单一的标准错误)。那时事情对我来说太复杂了。我试图重定向这个标准输出流(显然,对于整个应用程序/进程)并且在某些情况下它适用于我的 dll,但它仍然不适用于 EXTERNAL dll。 IE。如果我使用类似 cout << "Hey!";
的东西从我的 dll 中,我可以在我将流重定向到的文件中看到这个。但是,来自外部 dll 内部的相同调用(是的,我有它的来源,但我真的不想更改它们)没有任何作用。天知道这个输出是在哪里完成的。
我试过:
- 好老
freopen()
诡计。对我的 dll 有效,对外部 dll 无效。 - WinAPI
SetStdHandle()
称呼。根本不起作用。似乎在使用 Win7 时遇到了一些问题。 -
AllocConsole()
+_open_osfhandle()
.同1。看我在控制台的输出,看不到外部dll的输出。 -
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/