P / Invoke RemoveMenu SetLastError не работает - PullRequest
0 голосов
/ 07 мая 2020

мои коды:

[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)))
    {
        throw new Win32Exception();
    }
}

RemoveMenu(xxx, -1, false); //got exception and it's message is: The operation completed successfully.

Это означает, что API не устанавливал LastError при сбое. почему и как?

RemoveMenu API do c.

1 Ответ

1 голос
/ 07 мая 2020

Технически поведение не является неправильным. В документации просто говорится о вызове 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...