代码之家  ›  专栏  ›  技术社区  ›  Robert Fraser

从C中重定向本机dll stdout/stderr#

  •  3
  • Robert Fraser  · 技术社区  · 15 年前

    我正在尝试重定向第三方本机dll的输出,该dll从C_内输出到stdout/stderr。stdout和stderr的输出都应转到日志文件。

    以下是我的想法(两个流的x2):

    • 创建一个 AnonymousPipeServerStream
    • 把管子的把手拿过来 _outServer.SafePipeHandle.DangerousGetHandle()
    • 使用p/invoke调用 SetStdHandle 带上述手柄
    • 创建一个 AnonymousPipeClientStream 已连接到服务器流
    • 创建一个线程,使其位于从 AnonymousPipeClientStream 输出到记录器。
    • 定期打电话 flush AnonymousPipeServerStream

    所以这一切似乎都很有效…在我的代码中。一旦控件传递到本机dll,所有内容都将返回到stderr!如果需要的话,我可以调试到本机dll中,看看出了什么问题,但是…我真的不想这样,所以在我花10个小时试图弄清楚如何处理工作之前,有人有什么想法吗?

    供参考,测试代码位于: http://pastebin.com/f3eda7c8 . 有趣的是构造器中的第58-89行。(当然,稍后我将添加错误处理等)。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Robert Fraser    15 年前

    我解决了它,尽管解决方法(当然)与这个问题没有太多关系。DLL是在mingw中编译的,显然它不尊重MSVC运行时使用的句柄。

    我将保留代码和解决方案,以防其他人遇到此问题。