【发布时间】:2020-05-07 02:08:03
【问题描述】:
我的代码:
[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 文档。
【问题讨论】:
-
成功无法删除菜单项#4294967295。它不存在。您可以使用 Marshal.GetLastWin32Error() 来防止引发异常。但实际上,您会修复代码以指定正确的菜单项。
-
先谢谢你的评论。我正在编写一个组件,而不是调用者,所以我希望它在失败时抛出一个正确的错误。现在如果
hMenu是无效句柄,它可以工作,但如果项目是不存在的项目,则错误消息不正确。 -
"但是如果item是不存在的item,错误信息是不正确的。" 尝试先使用
GetMenuItemInfo来检查item是否存在。(error code = @ 987654326@如果不存在)