使用SHFileOperation:发生了什么错误

时间:2010-12-31 04:08:36

标签: c++ winapi

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

当函数SHFileOperation()失败时,返回值为0x57(十进制87)和0x2(十进制2)。任何人都可以帮我发现这些错误的定义(尤其是当你考虑这个函数时,错误不是GetLastError()代码的一部分)。

一些重要信息:

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

  • 我已经广泛调试过&据我所知,我的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;
 }

3 个答案:

答案 0 :(得分:5)

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

首先通过执行以下操作将所有内容设置为零:

SHFILEOPSTRUCT fileStruct = { 0 };

SHFILEOPSTRUCT fileStruct;
ZeroMemory(&fileStruct, sizeof(SHFILEOPSTRUCT));

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

答案 1 :(得分:1)

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

您的错误似乎是:

  

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

  

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

答案 2 :(得分:0)

在使用SHFileOperation处理宽字符串时,不仅需要double-null终止字符串,而且由于pFrom是字符串的 list ,您必须double-double-null终止路径字符串:

因此,在fileStruct.pFrom = dest.c_str();语句中,无法保证会给您带来双倍的null

您必须在分配前执行此操作:

WCHAR wszFrom[MAX_PATH] = { 0 };
StrCpyW(wszFrom, dest.c_str());
CopyMemory(wszFrom + lstrlenW(wszFrom), "\0\0", 2);

然后分配double-double-null字符串:

fileStruct.pFrom = wszFrom;

您可以避免使用此error

ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the file specified.