2010-12-31 13 views
6

Estoy usando la función SHFileOperation() para enviar un archivo a la papelera de reciclaje y estoy recibiendo 2 errores que no sé lo que significan porque con esta función los códigos de error no son GetLastError() valores.Usando SHFileOperation: Qué errores están ocurriendo

Cuando la función SHFileOperation() falla, los valores de retorno son 0x57 (decimal 87) y 0x2 (decimal 2). ¿Alguien puede ayudarme a descubrir las definiciones de estos errores (especialmente cuando se considera con esta función, los errores no son parte de los códigos GetLastError()).

algunos datos importantes:

  • estoy usando Windows 7 (& Sé que MSDN dice que use IFileOperation en lugar de SHFileOperation pero yo quiero hacer mi aplicación hacia atrás compatible por lo que estoy usando SHFileOperation) . Si el error se produce porque estoy usando SHFileOperation en Windows 7, ¿qué solución podría usar para hacer que esto funcione en todas las versiones de Windows desde 2000 &?

  • He depurado extensamente & por lo que sé que mi SHFILEOPSTRUCT es correcto (las banderas correctas utilizadas, .pFrom es una secuencia de doble terminación nula). Una cosa que sé con certeza es que mi ruta al archivo es correcta (conduce a un archivo real & correctamente formateado).

  • Sobre 2/5 veces el SHFileOperation() funciona, lo que significa que envía el archivo a la papelera de reciclaje & no devuelve un error

.

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; 
} 
+0

Su comentario es engañoso. Debes pasarlo a la misma línea que if o dentro de if bloack y cambiarlo a '// si delete failed' – sergiol

Respuesta

0

De acuerdo con la documentación SHFileOperation, esos errores mapa para los códigos de error de Windows estándar de Winerror.h usted puede buscar los códigos de error en this page on MSDN.

Sus errores parecen ser:

ERROR_FILE_NOT_FOUND 2 (0x2) El sistema no puede encontrar el archivo especificado.

y

ERROR_INVALID_PARAMETER 87 (0x57) El parámetro es incorrecta.

5

Como dijo shf301, el código de error 87 es ERROR_INVALID_PARAMETER. Esto probablemente ocurre porque no está inicializando el contenido de los campos SHFILEOPSTRUCT no utilizados, por lo que contendrá valores aleatorios. El documentation dice que pTo "debe establecerse en NULL si no se usa"; el sistema operativo podría estar verificando el valor de este campo y devolviendo un error si no es NULL.

primer set todo a cero, ya sea haciendo:

SHFILEOPSTRUCT fileStruct = { 0 }; 

o

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

código de error 2 es ERROR_FILE_NOT_FOUND; probablemente sea seguro ignorar este código de error si es posible que el archivo no exista o que el usuario lo haya eliminado antes de que el programa intente eliminarlo. (Tenga en cuenta que incluso si comprueba que el archivo existe antes de intentar eliminarlo, otro proceso podría haberlo eliminado mientras tanto, así que siempre tendrá que manejar este error).

3

Algunos problemas graves con este snippit, Yo sugeriría leer SHFILEOPSTRUCT structure

  1. pFrom debe ser doblemente terminada en nulo. No sé qué tipo es dest, pero casi con certeza no devuelve una cadena terminada doblemente nula.

  2. pEl parámetro debe establecerse en NULO si no se utiliza. Los caracteres comodín no están permitidos. Su uso dará lugar a resultados impredecibles.

  3. práctica segura sería llamar a la memoria cero en la estructura antes de llenarlo

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

  4. fileStruct.fAnyOperationsAborted = result; no pondrá el valor que la función devuelve en el resultado. existe la SHFILEOPSTRUCT en la pila y simplemente se puede leer después de la llamada

Estos problemas explican por sí mismos los códigos de error de su conseguir.

Cuestiones relacionadas