Файл удаляется в корзину, но после ответа на вопрос "действительно поместить в корзину..." вылетает ошибка "Программа выполнила недопустимую операцию и будет закрыта..." В чём ошибка? (или недоделка Код (Text): .386 .model flat, stdcall option casemap :none include \MASM32\INCLUDE\windows.inc include \MASM32\INCLUDE\kernel32.inc include \MASM32\INCLUDE\shell32.inc include \MASM32\INCLUDE\user32.inc include \MASM32\INCLUDE\masm32.inc includelib \MASM32\LIB\kernel32.lib includelib \MASM32\LIB\shell32.lib includelib \MASM32\LIB\user32.lib includelib \MASM32\LIB\masm32.lib DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD .data f1 db "C:\1.txt",0 .data? hInst HINSTANCE ? hIcon dd ? .code start: invoke GetModuleHandle, NULL mov hInst, eax invoke LoadIcon,hInst,200 mov hIcon, eax invoke DialogBoxParam, hInst, 500, NULL, addr DlgProc, NULL invoke ExitProcess, 0 DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL sh:SHFILEOPSTRUCT .IF uMsg==WM_INITDIALOG invoke SendMessage,hWnd,WM_SETICON,1,hIcon .ELSEIF uMsg==WM_CLOSE invoke EndDialog, hWnd,NULL .ELSEIF uMsg==WM_COMMAND .if wParam==502 push hWnd pop sh.hwnd mov sh.wFunc, FO_DELETE mov sh.pFrom, offset f1 mov sh.fFlags, FOF_ALLOWUNDO mov sh.fAnyOperationsAborted, FALSE invoke SHFileOperation, addr sh .endif .ENDIF xor eax, eax ret DlgProc endp end start
NoName Он не игнорируется. Он не используется. Суть разные понятия. Читаем msdn: pTo Address of a buffer to contain the name of the destination file or directory. This parameter must be set to NULL if it is not used. И на практике описаный в вопросе код не работает (прога вылетает) до установки pTo. При добавлении в код mov sh.pTo,NULL программы работает нормально. Файл удаляется, программа продолжает работать дальше, не вылетая.
Эта ошибка возникает, если буфер завершается не двумя нулями. Файл не находится ф-цией. Потому я и постил про два нуля.
Вот пример рабочей проги. Сам пропарился немеренно, так что, чтобы не было больше ниукого вопросов - выкладываю. _1268041732__1.rar
NoName А что париться-то? Сделал таки Если без двух нулей, выдаётся сообщение: "Не удаётся удалить файл. Не удаётся произвести чтение из файла или с диска." Или думал обмануть SHFileOperation? Опять лезем в msdn: pFrom Address of a buffer to specify one or more source file names. These names must be fully qualified paths. Standard DOS wild cards, such as "*", are permitted in the file-name position. Although this member is declared as a null-terminated string, it is used as a buffer to hold multiple file names. Each file name must be terminated by a single NULL character. An additional NULL character must be appended to the end of the final name to indicate the end of pFrom. pTo Address of a buffer to contain the name of the destination file or directory. This parameter must be set to NULL if it is not used. Like pFrom, the pTo member is also a double-NULL terminated string and is handled in much the same way.
NoName Кстати, пример благополучно не работает. Вылетает при запуске (предлагает отправить отчёт об ошибке Билли). Вот погляди пример, может не будет отправлять отчёты Там же и переключение с одним или двумя нулями сделал. _113822357__SHFileOp041027.zip
2 cresta Блин вашу бабку. У меня работал с двумя нулями и с одним. В моих исходниках четко написано, что кому надо, тот может написать еще один ноль! А насчет mov sh.pTo,NULL. У меня нет msdn на дисках, а траффик для жутко дорогой, поэтому в инете msdn смотрю в исключительных случаях. И самое главное по поводу этого нуля. Выдержка из win32api reference: FO_DELETE Deletes the files specified by pFrom (pTo is ignored). ВСЕ! Больше там нислова не сказано про то, что надо нулем это поле структуры заполнять. Немогу же я телепатически догадаться как у них функции с такими структурами работают. А про нули написано так, что можно подумать, что для одного файла можно и один ноль поставить: pFrom Pointer to a buffer that specifies one or more source file names. Multiple names must be null-separated. The list of names must be double null-terminated.
2 cresta Между прочим в своем аттаче мог бы и удалить кучу лишнего хлама, ибо как я знаю хозяева нашего замечательного форума очень нелюбят когда место неправильно расходуется. Токо спакойно
И кстати пункт exit в меню у тебя неработает. Я неговорю что это плохо или хорошо. Просто неработает и все.
NoName Это стандартный диалог, который создаёт RadASM, и необязательно использовать меню Exit. Пример был создан не для демонстрации работы меню, а для демонстрации влияния двух нулей Чтобы показать это, необязательно оптимизировать до бесконечности исходник, не так ли? Касательно "кучи лишнего хлама" : ты удалил в своём примере эту кучу, возможно поэтому он и не работает. Всё было оставлено, чтобы не надо было собирать по частям, всё готово, запустил и получил результат. P.S. Если нет msdn, то может не стоит делать категорических заявлений типа
Всё работает, если указать Код (Text): sh.pTo =NULL и завершать строку с именем файла двумя нулями. Раз затронили корзину, то может кто-нибудь подскажет, как программно узнать наличие файлов в корзине и как их также, программно, удалить? NoName Когда смотрел то, что сотворил cresta, неработающим пунктам внимания не придавал (главное в примере - не это). Так что хватит, а то оффтоп получается
да это в некоторой степени оффтоп но тут приницпиальные вопросы вылезли, и я немогу просто так пройти мимо несказав человеку свою точку зрения. 2 cresta Тогда на кой черт там меню? Конечно, может всем на это наплевать, но я лично нелюблю когда присутствуют такие излишества, есть еще одна причина почему критикую. Если берешся за мелкие вещи, то старайся делай все по минимуму. Таким образом съэкономишь места на чужом серваке и харде дргуих юзеров. Да, в этом случае казалось бы можно было бы принибречь размером, ибо архив занимает всего 25 кб. Но если не обращать внимания на эти мелкие штуки, то это дело плавно перерастает в большее. Странно мне казалось что ты сделал это для того, чтобы помочь человеку. Я даже не говорил об оптимизации. В этом случае ты хотяб лишние файлы удалил бы, было бы уже хорошо. Нет. Я удалил только res и obj. Все работает просто exe собран без второго нуля. Но в сорсе про это написано, так что хватит уже на меня бочку катить. Ты мои сообщения вообще читал? Или ты просто инглиша незнаешь? "FO_DELETE Deletes the files specified by pFrom (pTo is ignored). " дословно переводится: FO_DELETE Удаляет файлы, указанные в pFrom (pTo, игнорируется). 2 _Sysman_ Посомтри SHGetSpecialFolderLocation. Может поможет...
NoName Давай не будем жевать это, надоело уже. Человек получил свой NULL в pTo и два нуля в конце строки, подтвердил, что всё так и есть, как я написал, так чего ещё неймётся? _Sysman_ Очисткой корзины вроде занимается SHEmptyRecycleBin, тут в аттаче описание _2099247787__SHEmptyRecycleBin.zip