2

我编写了一个 python 程序,它通过管道重定向读取另一个进程的标准输出。但是,该程序在这一行中很糟糕:

print "[Input Thread] ", self.inputPipe.readline(ii)

错误是 IOError: [Errno 0] 错误

我找到了windows errno 0的解释。它很困惑,因为它定义为:

操作成功完成。

为什么一个操作成功完成会导致错误?

4

3 回答 3

3

这个名字可以欺骗你,但 ERROR_SUCCESS 实际上意味着没有错误。
来自https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx

ERROR_SUCCESS

0 (0x0)
操作成功完成。

于 2018-01-14T00:23:20.017 回答
1

我知道这有点老了,但花了相当多的时间试图找到一个完整的答案,但没有成功。所以我想我会分享我的发现。

发生这种情况的完整答案是,当您调用的 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());
}
于 2015-08-13T19:26:30.743 回答
0

Windows API 可能很棘手。您提到的第二个程序很可能没有正确检索错误号。它要么被覆盖,要么根本没有被拉入;所以它默认为0。

你没有说另一个程序是什么;但例如,在 .net 中,在声明外部调用时很容易忽略“SetLastError”标志。

[DllImport('kernel32.dll', SetLastError = true)]

https://www.medo64.com/2013/03/error-the-operation-completed-successfully/

于 2019-09-30T19:19:18.587 回答