C++ 使用SHFileOperation:发生了哪些错误

C++ 使用SHFileOperation:发生了哪些错误,c++,winapi,C++,Winapi,我正在使用函数SHFileOperation()将文件发送到回收站,我收到了两个错误,我不知道它们的意思,因为使用此函数时,错误代码不是GetLastError()值 当函数SHFileOperation()失败时,返回值为0x57(十进制87)和0x2(十进制2)。谁能帮助我发现这些错误的定义(特别是当你考虑这个函数时,这些错误不是 GETLASTROR()/代码的一部分。 一些重要信息: 我使用的是Windows7(我知道MSDN说使用IFileOperation而不是SHFileOper

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

当函数
SHFileOperation()
失败时,返回值为0x57(十进制87)和0x2(十进制2)。谁能帮助我发现这些错误的定义(特别是当你考虑这个函数时,这些错误不是<代码> GETLASTROR()/<代码>代码的一部分。

一些重要信息:

  • 我使用的是Windows7(我知道MSDN说使用IFileOperation而不是SHFileOperation,但我想让我的应用程序向后兼容,这就是我使用SHFileOperation的原因)。如果由于我在Windows 7上使用SHFileOperation而发生错误,我可以使用什么解决方案在2000年及以后的所有Windows版本上执行此操作

  • 我已经进行了大量调试&据我所知,我的SHFILEOPSTRUCT是正确的(使用了正确的标志,.pFrom是一个双空结束字符串)。有一件事我可以肯定,那就是我的文件路径是正确的(这将导致一个真正的文件&它的格式是正确的)

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

BOOL结果;
SHFILEOPSTRUCT fileStruct;
fileStruct.hwnd=hwnd;
fileStruct.wFunc=FO_DELETE;
fileStruct.pFrom=dest.c_str();
fileStruct.fFlags=FOF_FILESONLY;//福乌·阿洛文多
fileStruct.fanyooperatisaborted=结果;
//调用操作(删除文件)
int success=SHFileOperation(&fileStruct);
//如果删除成功
如果(成功!=0)
{
printf(“%s\t%X%d\n”,dest.c_str(),success,success);
cout根据文档,这些错误映射到WinError.h中的标准Windows错误代码。您可以在中查找这些错误代码

您的错误可能是:

错误\u文件\u未\u找到2(0x2)个 系统找不到指定的文件

错误\u参数87(0x57)无效\u 参数不正确


正如shf301所说,错误代码87是error\u INVALID\u参数。这可能是因为您没有初始化未使用的SHFILEOPSTRUCT字段的内容,因此这些字段将包含随机值。说明如果未使用,则必须将pTo设置为NULL;操作系统可能正在检查此字段的值,如果该字段为非空,则返回错误

首先,通过执行以下操作之一将所有设置为零:

SHFILEOPSTRUCT fileStruct = { 0 };


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

此snippit存在一些严重问题,我建议您阅读

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

  • 如果未使用pTo参数,则必须将其设置为NULL。不允许使用通配符。使用通配符将导致不可预测的结果

  • 安全的做法是在填充结构之前调用结构上的零内存

    SHFILEOPSTRUCT shStruct;
    零内存(&shStruct,sizeof(SHFILEOPSTRUCT))

  • fileStruct.fanyoOperationsaborted=result;不会将函数返回的值放入result中。SHFILEOPSTRUCT存在于堆栈上,可以在调用后简单地从中读取


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

    使用
    SHFileOperation
    处理宽字符串时,不仅需要
    double-null
    终止字符串,而且因为
    pFrom
    是字符串列表,所以必须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);
    
    然后分配双空字符串:

    fileStruct.pFrom = wszFrom;
    
    您可以防止出现此
    错误


    您的评论有误导性。您应该将其传递到if bloack的同一行或if bloack的内部,并将其更改为
    //if delete failed
    WCHAR wszFrom[MAX_PATH] = { 0 };
    StrCpyW(wszFrom, dest.c_str());
    CopyMemory(wszFrom + lstrlenW(wszFrom), "\0\0", 2);
    
    fileStruct.pFrom = wszFrom;
    
    ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the file specified.