我有一个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的同一个调用(是的,我有它的来源,但我真的不想改变它们)什么都不做。上帝知道这个输出在哪里完成。
我试过了:
freopen()
招数。为我的dll工作,对外部DLL没有任何影响。SetStdHandle()
致电。根本不起作用。似乎在Win7上遇到了一些麻烦。AllocConsole()
+ _open_osfhandle()
。与1.在控制台中查看我的输出,看不到外部dll的输出。cout.rdbuf()
重新分配。与3相同,但仅适用于cout。好吧,伙计们,我真的需要帮助。好像我被卡住了: - /
其他信息:
主机应用程序,我的DLL和外部DLL是使用MSVS'05开发的。所有dll都具有“在静态库中使用MFC”设置。测试在Win7 x64下完成。我确实拥有所有来源,但我无权更改它们。
答案 0 :(得分:1)
您正在通过“在静态库中使用MFC”设置搞砸了IIRC。设置/重新打开int(POSIX样式)句柄将不起作用,因为您的DLL和您的应用程序都使用不同的/独立的运行时库。解决方案:使用“在共享DLL中使用MFC”设置。在Windows上使用静态运行时库因为这种问题而被延迟了。
答案 1 :(得分:0)
你试过_dup2吗? MSDN文档中的示例显示了如何重定向stdout
。 (我不知道这是否适用于Windows级别的库或操作系统级别,因此它可能不适用于整个过程。)
当然,DLL也可能正在写入stderr
。