【问题标题】:Getting stdout when p-invoking to unmanaged DLL?调用非托管 DLL 时获取标准输出?
【发布时间】:2010-02-07 00:14:09
【问题描述】:

我有一个非托管 DLL,它正在将日志消息写入标准输出。我正在使用来自 WPF 应用程序的 P-invokes 调用此 DLL,并且我需要获取标准输出流日志。我试过 Console.SetOut,但这似乎只能捕获使用 Console.Write 等编写的信息。

有人有什么想法吗?我发现 similar questions 在别处问过,但他们没有答案。

【问题讨论】:

  • 您是否考虑过编写调用此 DLL、捕获标准输出然后通过 P/Invoke 将所有内容传回管理的中间本机 DLL?
  • 我想这是可能的。虽然这真的很烦人,因为我想在数据返回时显示它,所以它需要轮询以及额外的包装库。我希望有一种更清洁的方法。

标签: c# pinvoke stdout


【解决方案1】:

既然您已经调用了 PInvoke,我想您不会介意额外调用 SetStdHandle。类似的线程在这里Redirect stdout+stderr on a C# Windows service

【讨论】:

  • 在我提出这个问题后,我确实发现了这一点,但遗憾的是它对我不起作用。也许这是从 MinGW 交叉编译的事实以某种方式弄乱了输出流。我会尝试获取另一个 DLL 并查看构建方法是否有任何变化。
  • Accepting... 结果是我交叉编译的 MinGW .dll 行为不同。我必须让它捕获自己的输出并调用我通过 Pinvoke 给它的回调。
  • @RandomEngy 我的 C dll 也在 MinGW 中编译,我看到了同样的问题。您是否能够找到一种方法来实现这一点?
  • @Thick_propheT github.com/HandBrake/HandBrake/blob/master/libhb/hb.c 查看 hb_register_logger 和 redirect_thread_func 。还感兴趣:github.com/HandBrake/HandBrake/blob/master/win/CS/… 和 hb_register_logger pinvoke 设置在github.com/HandBrake/HandBrake/blob/master/win/CS/…
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 2011-06-13
  • 1970-01-01
  • 2013-08-17
  • 2011-11-29
  • 2010-11-02
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多