使用SHFileOperation:发生了什么错误

Sas*_*cha 6 c++ winapi

我正在使用该函数SHFileOperation()将文件发送到回收站,我得到2个错误,我不知道它们是什么意思,因为使用此函数时错误代码不是GetLastError()值.

当函数SHFileOperation()失败时,返回值为0x57(十进制87)和0x2(十进制2).任何人都可以帮助我发现这些错误的定义(特别是当您考虑使用此功能时,错误不是GetLastError()代码的一部分).

一些重要信息:

  • 我正在使用Windows 7(我知道MSDN说使用IFileOperation而不是SHFileOperation,但我想使我的应用程序向后兼容,这就是我使用SHFileOperation的原因).如果错误发生,因为我在Windows 7上使用SHFileOperation,我可以用什么解决方案使这个工作在2000及以上的所有Windows版本上运行?

  • 我已经进行了广泛的调试,据我所知,我的SHFILEOPSTRUCT是正确的(使用了正确的标志,.pFrom是一个双零结束的字符串).我确定的一件事是我的文件路径是正确的(导致一个真实的文件,它正确格式化).

  • 大约是SHFileOperation()的2/5倍,这意味着它将文件发送到回收站并且不会返回错误

.

 BOOL result;
 SHFILEOPSTRUCT fileStruct;
 fileStruct.hwnd = hwnd; 
 fileStruct.wFunc = FO_DELETE;
 fileStruct.pFrom = dest.c_str();
 fileStruct.fFlags = FOF_FILESONLY; // FOF_ALLOWUNDO
 fileStruct.fAnyOperationsAborted = result;

 // Call operation(delete file)
 int success = SHFileOperation( &fileStruct );

 // if delete was successful
 if ( success != 0 ) 
 {
    printf( "%s \t %X %d \n", dest.c_str(), success, success );
    cout << result << endl;

    MessageBox( hwnd, "Failed to delete file", "Error", MB_OK|MB_ICONERROR );
    return;
 }
Run Code Online (Sandbox Code Playgroud)

Bra*_*ger 5

正如shf301所说,错误代码87是ERROR_INVALID_PARAMETER.这可能是因为您没有初始化未使用的SHFILEOPSTRUCT字段的内容,因此它们将包含随机值.该文件说,pTo"如果不使用时,必须设置为NULL"; 操作系统可能正在检查此字段的值,如果它是非NULL,则返回错误.

首先通过以下方式将所有内容设置为零:

SHFILEOPSTRUCT fileStruct = { 0 };
Run Code Online (Sandbox Code Playgroud)

要么

SHFILEOPSTRUCT fileStruct;
ZeroMemory(&fileStruct, sizeof(SHFILEOPSTRUCT));
Run Code Online (Sandbox Code Playgroud)

错误代码2是ERROR_FILE_NOT_FOUND; 如果文件可能不存在,或者在程序尝试删除文件之前用户已将其删除,则忽略此错误代码可能是安全的.(请注意,即使您在尝试删除文件之前检查该文件是否存在,另一个进程可能会在此期间将其删除,因此您始终需要处理此错误.)


8bi*_*ide 5

这个片段有一些严重的问题,我建议阅读SHFILEOPSTRUCT 结构

  1. `pFrom 必须以双 null 结尾。我不知道 dest 是什么类型,但它几乎肯定不会返回以双 null 结尾的字符串。

  2. pToNULL如果不使用该参数,则必须设置为。不允许使用通配符。它们的使用将导致不可预测的结果。

  3. 安全的做法是在填充结构之前调用零内存:

SHFILEOPSTRUCT shStruct;    
ZeroMemory (&shStruct, sizeof(SHFILEOPSTRUCT));
Run Code Online (Sandbox Code Playgroud)
  1. fileStruct.fAnyOperationsAborted = 结果;won't put the value the function returns into result. TheSHFILEOPSTRUCT` 存在于堆栈中,可以在调用后简单地读取。

这些问题本身就解释了您收到的错误代码。


shf*_*301 2

根据SHFileOperation文档,这些错误映射到 WinError.h 中的标准 Windows 错误代码,您可以在MSDN 的此页面查找这些错误代码。

您的错误似乎是:

ERROR_FILE_NOT_FOUND 2 (0x2) 系统找不到指定的文件。

ERROR_INVALID_PARAMETER 87 (0x57) 参数不正确。