4

我使用 Sertac Akyuz 在此处回答中放置的代码创建此菜单: 显示默认的右键单击菜单 - Delphi ,它运行良好,但有问题:当我点击创建的菜单时:删除(删除文件以回收) - 它询问我:Are you sure want to delete?

当我单击是时 - 它工作正常,但是当我单击否时 - 它显示一个错误,我在调试器中看到,错误在线:

OleCheck(ContextMenu.InvokeCommand(CommandInfo));

Error: ###(gdb unparsed remainder:s 0x0 out of bounds>)###.

我使用 Lazarus,但我认为,在 Delphi 中它也是实际的。

在我看来,菜单(窗口)试图返回我的程序答案 - 不,在这种情况下会发生错误。

如何解决这个问题呢?回答“否”如何正确解决这种情况?

4

1 回答 1

3

您没有指定错误号,但是当我尝试复制这些步骤时,OleCheck调用失败并显示0x80270000. 高位字部分,保存错误位,是0x27(39),FACILTY_SHELL在“winerror.h”中定义。如您所见,低位字是'0',shell没有给出任何具体的错误代码,实际上代码与ERROR_SUCCESSor相同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;
    ...
于 2013-03-17T02:54:15.367 回答