我使用Sertac Akyuz在此处回答的代码创建此菜单:
Show the default right-click menu - Delphi
它运作良好,但有问题:
当我点击创建的菜单时:删除(删除文件以回收) - 它会问我:Are you sure want to delete?
当我点击是 - 它可以正常工作,但当我点击否 - 它会显示错误, 我在调试器中看到错误在线:
OleCheck(ContextMenu.InvokeCommand(CommandInfo));
Error: ###(gdb unparsed remainder:s 0x0 out of bounds>)###.
我使用Lazarus,但我想,在Delphi中它也是实际的。
在我看来,菜单(windows)尝试将答案返回给我的程序 - 不,在这种情况下会发生错误。
如何解决这个问题?如何正确解答这种情况并回答“否”?
答案 0 :(得分:3)
您尚未指定错误编号,但当我尝试复制这些步骤时,OleCheck
调用失败并显示0x80270000
。保存错误位的高字部分是0x27
(39),即{winerror.h'中定义的FACILTY_SHELL
。如您所见,低位字为“0”,shell不提供任何特定的错误代码,实际上代码与ERROR_SUCCESS
或NO_ERROR
相同。
我的解释是,shell只是通知命令(删除操作)失败。失败是由于用户取消操作。我的建议是,根据需要相应地修改代码。您知道操作失败,但您可以选择忽略它,或者可能通知用户。也许是这样的:
var
...
InvokeResult: HRESULT;
begin
...
// OleCheck(ContextMenu.InvokeCommand(CommandInfo));
InvokeResult := ContextMenu.InvokeCommand(CommandInfo);
if not Succeeded(InvokeResult) then begin
if LoWord(InvokeResult) = NO_ERROR then
ShowMessage('Command did not carried out')
else
OleError(InvokeResult);
end;
...