Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从dll重定向标准输出_C++_C - Fatal编程技术网

C++ 如何从dll重定向标准输出

C++ 如何从dll重定向标准输出,c++,c,C++,C,我有一个dll文件,通过std::cout写入STDOUT 是否可以将输出从dll重定向到使用它的应用程序,而不必在dll内创建功能?例如,是否仍然可以“侦听”其输出 我正在寻找一个跨平台工作的答案。DLL不是一个单独的进程,而是一个加载到应用程序地址空间的动态库。这意味着,当DLL调用printf或任何输出到stdout/stderr处理程序中时,它将继承stdout/stderr处理程序或正在运行的应用程序,并将在应用程序中放入printf时起作用。 如果要捕获从DLL调用的内容的输出,则需

我有一个dll文件,通过
std::cout
写入
STDOUT

是否可以将输出从dll重定向到使用它的应用程序,而不必在dll内创建功能?例如,是否仍然可以“侦听”其输出


我正在寻找一个跨平台工作的答案。

DLL不是一个单独的进程,而是一个加载到应用程序地址空间的动态库。这意味着,当DLL调用printf或任何输出到stdout/stderr处理程序中时,它将继承stdout/stderr处理程序或正在运行的应用程序,并将在应用程序中放入printf时起作用。 如果要捕获从DLL调用的内容的输出,则需要从调用DLL函数的代理EXE运行它。这样,您就可以将stdout/stderr管道重定向到您的进程并执行任何您想要的操作


顺便说一句,在我看来,这是一个完全错误的方法。如果你使用DLL,你应该从它的函数中得到一些返回码,而不是在标准输出上传递。

关于跨平台的要求,忘掉它吧。当您在窗口中插入以下内容时:

  • 控制台/gui选项
  • 由dll和主机应用程序链接的可能不同的libc(msvcrt)
我将重点介绍windows,因为我希望这在Unix上更容易(只需重定向主机应用程序stdout/stderr)

首先,确保主机应用程序和DLL链接了相同的msvcrt。”如果加载不同的msvcrt实例(即主机应用程序链接调试msvcrt和DLL链接发布msvcrt),则“stdout”表示不同的对象


根据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将其传递给应用程序。