Shell函数的失败返回值

时间:2014-05-03 19:49:18

标签: delphi winapi

我正在使用:

Result := not Boolean(SHFileOperation(lpFileOp));
FOperationAborted := lpFileOp.fAnyOperationsAborted

复制文件,在极少数情况下,文件副本由于某种原因无法完成。我似乎找不到OpAbort以外的返回值和函数的布尔本身。

我尝试使用GetLastError,但总是为零。

有什么方法可以找出错误是什么? 它可能是磁盘已满,文件名无效,写保护目标,硬件磁盘写入错误或任何其他问题,如果发生错误,我似乎无法弄清楚如何处理错误。

2 个答案:

答案 0 :(得分:3)

您需要仔细阅读该功能的documentation。它说:

  

返回值

     

输入:int

     

如果成功则返回零;否则非零。应用正常   应该只检查零或非零。

     

最好检查fAnyOperationsAborted的值   SHFILEOPSTRUCT的成员。 SHFileOperation可以返回0表示成功   如果用户取消操作。如果你不检查   fAnyOperationsAborted以及返回值,你无法知道   该功能完成了你和它所要求的完整任务   可能会在不正确的假设下进行。

     

不要将GetLastError与此函数的返回值一起使用。

     

要检查非零值以进行故障排除,请执行此操作   主要映射到Winerror.h中定义的那些。但是,它的几个   可能的返回值基于Win32之前的错误代码,其中包含   某些情况会重叠后来的Winerror.h值而不匹配它们   含义。这些特定值在此处详细说明   具体值只有这些含义应该被接受   Winerror.h代码。但是,这些值随这些提供   警告:

     
      
  • 这些是Win32之前的错误代码,不再支持或在任何公共头文件中定义。要使用它们,您必须定义   他们自己或与数值进行比较。
  •   
  • 这些错误代码可能会发生变化,并且历史上已经这样做了。
  •   
  • 这些值仅作为调试帮助提供。它们不应被视为决定性的。
  •   
     

.... 表已删除,请参阅documentation ....

因此,简而言之,您必须捕获返回值,这是一个整数。如果返回值不为零,则函数将失败。然后文档告诉您如何将该返回值解释为推断失败原因的方法。请注意,文档清楚地表明这些失败原因并不确定。文档清楚地表明不会调用GetLastError

如果报告准确的错误消息很重要,那么您应该使用IFileOperation代替。其documentation提供了一长串理由,希望将其更改为SHFileOperation。其中之一是:

  

通过HRESULT值与FormatMessage等API一起进行更准确的错误报告。 SHFileOperation的返回代码可能会产生误导或不准确。

答案 1 :(得分:0)

由于Windows Vista SHFileOperation已被弃用并被IFileOperation取代。在行之间读取,原始SHFileOperation代码已被丢弃,并且已通过调用IFileOperation重新实现。这似乎有后果。

  1. 新错误,可能无法修复。
  2. 不可靠的错误报告。
  3. 可能的并发/线程问题(Shell不再自行执行这些操作)。
  4. 最重要的是,您看到的错误可能无法解决。绝对检查返回值(根据文档),你可能会很幸运。如果可能的话,考虑切换到IFileOperation,它提供更好的进度报告和错误诊断。