Технически поведение не является неправильным. В документации просто говорится о вызове GetLastError()
в случае сбоя, но не говорится, что GetLastError()
не может вернуть 0 в качестве причины. И действительно, по крайней мере, согласно CMenu :: RemoveMenu не работает , на самом деле сообщается 0 (хотя что-то вроде ERROR_MENU_ITEM_NOT_FOUND
имело бы больше смысла).
Это очень просто для обхода, используя Marshal.GetLastWin32Error()
перед тем, как бросить Win32Exception
:
[DllImport("user32.dll", SetLastError = true)]
static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);
static void RemoveMenu(IntPtr hMenu, int item, bool byPosition)
{
if (!RemoveMenu(hMenu, (uint)item, (uint)(byPosition ? 0x400 : 0)))
{
int err = Marshal.GetLastWin32Error();
if (err != 0)
throw new Win32Exception(err);
}
}
RemoveMenu(xxx, -1, false);