私はこれが昔のことだと知っていますが、成功せずに完全な答えを見つけるためにかなりの時間を費やしています。だから、私が分かったことを分かち合いたいと思った。
どのように起こるかの完全な答えは、あなたが「失敗」した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());
}
は通常、それは一般的に成功を示します。明らかにあなたが何をしたのかは問題があると思っていて、実際にはなかったときには「エラーメッセージ」が表示されました。 –
'ERROR_SUCCESS'はWinAPIで「エラーなし」を意味します。同じ人工の "名前空間を定義する"ために、接頭辞ERROR_が付いています。私はIOErrorビットにもっと注意を払いますが、何が原因かわかりません。 –