2010-12-31 18 views
6

Sto utilizzando la funzione SHFileOperation() per inviare un file al cestino di riciclaggio e sto ricevendo 2 errori che non so cosa significano perché con questa funzione i codici di errore non sono valori GetLastError().Utilizzo di SHFileOperation: Quali errori si verificano

Se la funzione SHFileOperation() non riesce, i valori di ritorno sono 0x57 (decimale 87) e 0x2 (decimale 2). Qualcuno può aiutarmi a scoprire le definizioni di questi errori (specialmente se si considera con questa funzione, gli errori non fanno parte dei codici GetLastError()).

Alcune informazioni importanti:

  • Sto usando Windows 7 (& so che MSDN dice di usare IFileOperation invece di SHFileOperation ma voglio fare la mia app all'indietro compatibile ed è per questo che sto usando SHFileOperation) . Se l'errore si verifica perché sto utilizzando SHFileOperation su Windows 7 quale soluzione posso usare per far funzionare tutto su tutte le versioni di Windows dal 2000 & su?

  • Ho eseguito il debug in modo completo & per quanto ne so il mio SHFILEOPSTRUCT è corretto (flag corretti usati,. PFrom è una stringa con doppio zero finale). Una cosa che so per certo è che il mio percorso verso il file è corretto (porta a un file reale & correttamente formattato).

  • circa 2/5 volte la SHFileOperation() funziona, il che significa che invia il file nel cestino & non restituisce un errore

.

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

Il tuo commento è fuorviante. Dovresti passarlo alla stessa riga di if o inside the if bloack e cambiarlo in // // if delete failed – sergiol

risposta

0

Secondo la documentazione SHFileOperation, quegli errori mappa per i codici di errore standard di Windows da Winerror.h si può cercare quei codici di errore in this page on MSDN.

vostri errori sembrano essere:

ERROR_FILE_NOT_FOUND 2 (0x2) Il sistema non riesce a trovare il file specificato.

e

ERROR_INVALID_PARAMETER 87 (0x57) Il parametro non è corretto.

5

Come indicato da shf301, il codice di errore 87 è ERROR_INVALID_PARAMETER. Ciò probabilmente si verifica perché non stai inizializzando il contenuto dei campi SHFILEOPSTRUCT non utilizzati, quindi conterranno valori casuali. Lo documentation dice che pTo "deve essere impostato su NULL se non viene utilizzato"; il sistema operativo potrebbe controllare il valore di questo campo e restituire un errore se non è NULL.

Prima impostare tutto a zero o facendo:

SHFILEOPSTRUCT fileStruct = { 0 }; 

o

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

codice di errore 2 è ERROR_FILE_NOT_FOUND; è probabilmente sicuro ignorare questo codice di errore se è possibile che il file non esista o che l'utente lo abbia eliminato prima che il programma tenti di eliminarlo. (Si noti che anche se si controlla che il file esista prima di provare a eliminarlo, un altro processo potrebbe averlo eliminato nel frattempo, quindi sarà sempre necessario gestire questo errore.)

3

Alcuni seri problemi con questo snippit, Io suggerirei la lettura SHFILEOPSTRUCT structure

  1. pFrom deve essere doppiamente nulla terminata. Non so che tipo dest sia, ma quasi certamente non restituisce una stringa terminata doppiamente nulla.

  2. pPer il parametro deve essere impostato su NULL se non viene utilizzato. I caratteri jolly non sono consentiti. Il loro uso porterà a risultati imprevedibili.

  3. pratica sicura sarebbe quella di chiamare la memoria zero sulla struct prima di riempirlo

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

  4. fileStruct.fAnyOperationsAborted = risultato; non inserirà il valore restituito dalla funzione nel risultato. lo SHFILEOPSTRUCT esiste nello stack e può essere letto semplicemente dal termine della chiamata

questi problemi si spiegano i codici di errore vostro ottenere.

Problemi correlati