Я знаю, что это довольно старо, но потратил немало времени, пытаясь найти полный ответ без успеха.Поэтому я решил поделиться тем, что выяснил.
Полный ответ о том, как это происходит, - это когда метод 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());
}