C++ 如何从dll重定向标准输出
我有一个dll文件,通过C++ 如何从dll重定向标准输出,c++,c,C++,C,我有一个dll文件,通过std::cout写入STDOUT 是否可以将输出从dll重定向到使用它的应用程序,而不必在dll内创建功能?例如,是否仍然可以“侦听”其输出 我正在寻找一个跨平台工作的答案。DLL不是一个单独的进程,而是一个加载到应用程序地址空间的动态库。这意味着,当DLL调用printf或任何输出到stdout/stderr处理程序中时,它将继承stdout/stderr处理程序或正在运行的应用程序,并将在应用程序中放入printf时起作用。 如果要捕获从DLL调用的内容的输出,则需
std::cout
写入STDOUT
是否可以将输出从dll重定向到使用它的应用程序,而不必在dll内创建功能?例如,是否仍然可以“侦听”其输出
我正在寻找一个跨平台工作的答案。DLL不是一个单独的进程,而是一个加载到应用程序地址空间的动态库。这意味着,当DLL调用printf或任何输出到stdout/stderr处理程序中时,它将继承stdout/stderr处理程序或正在运行的应用程序,并将在应用程序中放入printf时起作用。 如果要捕获从DLL调用的内容的输出,则需要从调用DLL函数的代理EXE运行它。这样,您就可以将stdout/stderr管道重定向到您的进程并执行任何您想要的操作
顺便说一句,在我看来,这是一个完全错误的方法。如果你使用DLL,你应该从它的函数中得到一些返回码,而不是在标准输出上传递。关于跨平台的要求,忘掉它吧。当您在窗口中插入以下内容时:
- 控制台/gui选项
- 由dll和主机应用程序链接的可能不同的libc(msvcrt)
根据DLL的不同,您可能希望使用(和组合)不同方法的详细信息。您的问题不清楚。您想在调用方应用程序的控制台内查看打印,还是实际将dll写入您提供的其他流?是否尝试过?@user3613500我想在调用方应用程序内查看打印。例如,dll将写入
cout
,而不管正在侦听什么(如果有)。我能想到的一个现实世界的例子是,如果你在linux终端上运行一个程序,并且该程序写入STDOUT
,那么它将只打印到终端上,但是你可以使用2>&1
@BeyelerStudios将它重定向到其他地方,看起来它会工作,但是这个例子使用的是应用程序STDOUT
,如何从dll中获取STDOUT
?例如,为什么不说它写入STDOUT
,而不是std::cout
?因此,一个函数可以返回指向std::streambuf
对象的指针或指向std::ostream
对象的指针?如果您想绝对解析文本输出,您可以简单地传入一个流或缓冲区,而不是使用printf,将该数据放入缓冲区中。我可以问一下您需要处理什么类型的信息吗?它只是调试信息,例如错误消息、id、变量内容、函数信息。但在发送到输出之前,它都被格式化为文本。为什么需要将其重新分析到应用程序中?如果您告诉我们您的应用程序做什么,我们可能会建议一种不同的方法dll具有与服务器/数据库通信的功能,如果dll中出现任何错误,它将抛出并写入跟踪(输出到STDOUT
)。对于大多数应用程序,如果需要,我只需要使用dll将其传递给应用程序。