Использование SHFileOperation: какие ошибки происходят - PullRequest
6 голосов
/ 31 декабря 2010

Я использую функцию SHFileOperation() для отправки файла в мусорную корзину, и я получаю 2 ошибки, которые я не знаю, что они означают, потому что с этой функцией коды ошибок не GetLastError() значения.

При сбое функции SHFileOperation() возвращаемыми значениями являются 0x57 (десятичное 87) и 0x2 (десятичное 2). Может ли кто-нибудь помочь мне найти определения этих ошибок (особенно, если учесть эту функцию, ошибки не являются частью GetLastError() кодов).

Немного важной информации:

  • Я использую Windows 7 (и я знаю, что MSDN говорит использовать IFileOperation вместо SHFileOperation, но я хочу сделать свое приложение обратно совместимым, поэтому я использую SHFileOperation). Если ошибка возникает из-за того, что я использую SHFileOperation в Windows 7, какое решение я могу использовать, чтобы эта работа работала на всех версиях Windows от 2000 года и старше?

  • Я много отлаживал и насколько я знаю, мой SHFILEOPSTRUCT правильный (используются правильные флаги, .pFrom - строка с двойным нулем в конце). Одно я точно знаю, что мой путь к файлу правильный (ведет к реальному файлу и правильно отформатирован).

  • Примерно в 2/5 раз работает SHFileOperation (), то есть он отправляет файл в корзину и не возвращает ошибку

.

 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 ]

5 голосов
/ 31 декабря 2010

Как сказал shf301, код ошибки 87: ERROR_INVALID_PARAMETER. Вероятно, это происходит потому, что вы не инициализируете содержимое неиспользуемых полей SHFILEOPSTRUCT, поэтому они будут содержать случайные значения. В документации сказано, что pTo "должно быть установлено в NULL, если оно не используется"; ОС может проверять значение этого поля и возвращать ошибку, если оно не равно NULL.

Сначала установите все на ноль, выполнив:

SHFILEOPSTRUCT fileStruct = { 0 };

или

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

Код ошибки 2: ERROR_FILE_NOT_FOUND; возможно, безопасно игнорировать этот код ошибки, если возможно, что файл не существует или пользователь удалил его до того, как ваша программа попытается удалить его. (Обратите внимание, что даже если вы проверите, что файл существует, прежде чем пытаться удалить его, другой процесс мог бы удалить его тем временем, поэтому вам всегда нужно будет обработать эту ошибку.)

4 голосов
/ 11 октября 2012

Некоторые серьезные проблемы с этим фрагментом, я бы посоветовал прочитать структуру SHFILEOPSTRUCT

  1. pFrom должен быть дважды завершен нулем.Я не знаю, что такое тип dest, но он почти наверняка не возвращает строку с двойным нулевым окончанием.

  2. Параметр pTo должен быть установлен в NULL, если он не используется.Подстановочные знаки недопустимы.Их использование приведет к непредсказуемым результатам.

  3. Безопасной практикой будет вызов нулевой памяти в структуре перед ее заполнением

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

  4. fileStruct.fAnyOperationsAborted = result;не будет помещать значение, которое функция возвращает в результат.SHFILEOPSTRUCT существует в стеке и может быть просто прочитан после вызова

Эти проблемы сами по себе объясняют коды ошибок, которые вы получаете.

1 голос
/ 31 декабря 2010

Согласно документации SHFileOperation , эти ошибки соответствуют стандартным кодам ошибок Windows из WinError.h. Эти коды ошибок можно найти на этой странице в MSDN .

Ваши ошибки могут быть:

ERROR_FILE_NOT_FOUND 2 (0x2) система не может найти указанный файл.

и

ERROR_INVALID_PARAMETER 87 (0x57) параметр неверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...