我编写了一个python程序,它通过管道重定向读取另一个进程的stdout。 但是,该计划很糟糕:
print "[Input Thread] ", self.inputPipe.readline(ii)
错误是IOError:[Errno 0]错误
我找到了windows errno 0的解释。它让人感到困惑,因为它定义为:
操作成功完成。
为什么操作成功完成会导致错误?
答案 0 :(得分:1)
我知道这有点旧,但花了相当多的时间试图找到一个完整的答案而没有成功。所以我想我会分享我已经想到的东西。
如何发生这种情况的完整答案,就是你调用的pInvoke方法"失败"但不是因为错误。
你认为
例如,假设您需要取消挂钩窗口挂钩,但由于您的对象架构中有一些意大利面条或偏执级别的防御性编程,它会被调用两次。
// hook assigned earlier
// now we call our clean up code
if (NativeMethods.UnhookWindowsHookEx(HookHandle) == 0)
{
// method succeeds normally so we do not get here
Log.ReportWin32Error("Error removing hook", Marshal.GetLastWin32Error());
}
// other code runs, but the hook is never reattached,
// due to paranoid defensive program you call your clean up code twice
if (NativeMethods.UnhookWindowsHookEx(HookHandle) == 0)
{
// pInvoke method failed (return zero) because there was no hook to remove
// however there was no error, the hook was already gone thus ERROR_SUCCESS (0)
// is our last error
Log.ReportWin32Error("Error removing hook", Marshal.GetLastWin32Error());
}
答案 1 :(得分:0)
这个名字可以欺骗你,但ERROR_SUCCESS实际上意味着没有错误 来自https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx:
<强> ERROR_SUCCESS 强>
0(0x0)
操作成功完成。
答案 2 :(得分:0)
Windows API可能很棘手。您提到的第二个程序很可能没有正确检索错误号。它要么被覆盖,要么根本没有被拉入。因此它默认为0。
您没有说其他程序是什么;但是例如,在.net中,在声明您的外部调用时很容易忽略“ SetLastError”标志。
[DllImport('kernel32.dll', SetLastError = true)]