我有一个通过STDOUT
写入std::cout
的dll文件。
是否有将dll的输出重定向到正在使用它的应用程序,而无需在dll中创建功能?例如,无论如何都要听#34;听"它的输出?
我正在寻找一个跨平台工作的答案。
答案 0 :(得分:2)
DLL不是一个单独的进程,而是一个加载到应用程序地址空间的动态库。这意味着,当DLL调用printf或任何输出到stdout / stderr处理程序时,将继承stdout / stderr句柄或正在运行的应用程序,并且当你将printf放入应用程序时,它的行为确实如此。 如果要捕获从DLL调用的内容的输出,则需要从调用DLL函数的代理EXE运行它。通过这种方式,您可以将stdout / stderr管道重定向到您的流程并执行您想要的任何操作。
顺便说一句,在我看来,这将是一个完全错误的方法。如果使用DLL,则应该从其函数中获得某种返回码,而不是在stdout上的输出中继。
答案 1 :(得分:1)
关于跨平台要求,忘掉它。当你扔进窗户时:
我将专注于 Windows,因为我希望这些东西在 Unix 上更容易(只需重定向主机应用程序 stdout/stderr)。
首先确保相同的 msvcrt 由宿主应用程序和 DLL 链接。如果加载不同的 msvcrt 实例(即宿主应用程序链接调试 msvcrt 和 DLL 链接发布 msvcrt),“stdout”表示不同的对象。
above link 详细说明了您可能希望根据 DLL 使用(和组合)的不同方法。