我编写了一个 python 程序,它通过管道重定向读取另一个进程的标准输出。但是,该程序在这一行中很糟糕:
print "[Input Thread] ", self.inputPipe.readline(ii)
错误是 IOError: [Errno 0] 错误
我找到了windows errno 0的解释。它很困惑,因为它定义为:
操作成功完成。
为什么一个操作成功完成会导致错误?
我编写了一个 python 程序,它通过管道重定向读取另一个进程的标准输出。但是,该程序在这一行中很糟糕:
print "[Input Thread] ", self.inputPipe.readline(ii)
错误是 IOError: [Errno 0] 错误
我找到了windows errno 0的解释。它很困惑,因为它定义为:
操作成功完成。
为什么一个操作成功完成会导致错误?
这个名字可以欺骗你,但 ERROR_SUCCESS 实际上意味着没有错误。
来自https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx:
ERROR_SUCCESS
0 (0x0)
操作成功完成。
我知道这有点老了,但花了相当多的时间试图找到一个完整的答案,但没有成功。所以我想我会分享我的发现。
发生这种情况的完整答案是,当您调用的 pInvoke 方法“失败”但不是因为错误时。
呵呵,你觉得
例如,假设您需要解开一个 windows 挂钩,但由于您的对象架构中的一些意大利面条或偏执级别的防御性编程,它被调用了两次。
// 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());
}
Windows API 可能很棘手。您提到的第二个程序很可能没有正确检索错误号。它要么被覆盖,要么根本没有被拉入;所以它默认为0。
你没有说另一个程序是什么;但例如,在 .net 中,在声明外部调用时很容易忽略“SetLastError”标志。
[DllImport('kernel32.dll', SetLastError = true)]
https://www.medo64.com/2013/03/error-the-operation-completed-successfully/