如何使用WriteFile写入stderr

时间:2013-01-07 13:11:50

标签: c++ winapi

是否可以让HANDLE引用可以在Windows上使用WriteFile编写的标准错误输出?

我问的原因是我正在为我编写一些日志工具。我试图将数据直接提供给系统:

  • 避免任何未被冲洗的潜在问题
  • 让系统交错来自不同线程的消息而不需要锁定(如果实际上有效则是另一个问题)。

应用程序是否是Windows子系统,所以它应该只在应用程序实际继承​​标准错误的任何地方写入?如果那是可能的,那就是。

注意:我已经有OutputDebugString的日志接收器。它与其他几个平台相当。并且文件,它使用低级API来避免任何额外的缓冲(因为消息已经在堆栈缓冲区中组装并且需要立即刷新)。我只是想重用代码来编写文件来写标准错误。

2 个答案:

答案 0 :(得分:9)

GetStdHandleSTD_ERROR_HANDLE一起使用。

HANDLE stderr = GetStdHandle(STD_ERROR_HANDLE);
WriteFile(stderr, /*...*/);

答案 1 :(得分:-1)

stderr不是Windows原生的,在进程初始化C运行时库子系统(?)之前不会打开。

选择

WriteFile是因为它是写入的最低级API,但WriteFile可能会破坏stderr的内部一致性,这显然没有正确锁定。

为了调试/跟踪,Windows SDK提供了OutputDebugString API。许多Windows程序员使用此API和DebugView进行开发。

对于一般日志记录,Write an Event to the Event viewer会更有用。

我的建议是VC ++ CRTDBG库(link)。真的很棒!