Удаление в корзину

Тема в разделе "WASM.WIN32", создана пользователем _Sysman_, 26 окт 2004.

  1. _Sysman_

    _Sysman_ Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    50
    Адрес:
    Ukraine
    Файл удаляется в корзину, но после ответа на вопрос "действительно поместить в корзину..." вылетает ошибка "Программа выполнила недопустимую операцию и будет закрыта..."

    В чём ошибка? (или недоделка :)


    Код (Text):
    1.  
    2.     .386
    3.     .model flat, stdcall
    4.     option casemap :none
    5.    
    6.     include \MASM32\INCLUDE\windows.inc
    7.     include \MASM32\INCLUDE\kernel32.inc
    8.     include \MASM32\INCLUDE\shell32.inc
    9.     include \MASM32\INCLUDE\user32.inc
    10.     include \MASM32\INCLUDE\masm32.inc
    11.    
    12.  
    13.     includelib \MASM32\LIB\kernel32.lib
    14.     includelib \MASM32\LIB\shell32.lib
    15.     includelib \MASM32\LIB\user32.lib
    16.     includelib \MASM32\LIB\masm32.lib
    17.    
    18.     DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    19.  
    20. .data
    21.  
    22. f1 db "C:\1.txt",0
    23.  
    24.  
    25. .data?
    26. hInst HINSTANCE ?
    27. hIcon dd ?
    28.  
    29.  
    30. .code
    31.  
    32. start:
    33.  
    34. invoke GetModuleHandle, NULL
    35. mov hInst, eax
    36. invoke LoadIcon,hInst,200
    37. mov hIcon, eax    
    38. invoke DialogBoxParam, hInst, 500, NULL, addr DlgProc, NULL
    39. invoke ExitProcess, 0
    40.  
    41. DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    42. LOCAL sh:SHFILEOPSTRUCT
    43.     .IF uMsg==WM_INITDIALOG
    44.     invoke SendMessage,hWnd,WM_SETICON,1,hIcon
    45.     .ELSEIF uMsg==WM_CLOSE
    46.         invoke EndDialog, hWnd,NULL
    47.     .ELSEIF uMsg==WM_COMMAND
    48.        
    49.     .if wParam==502
    50.     push hWnd
    51.     pop sh.hwnd
    52.     mov sh.wFunc, FO_DELETE
    53.     mov sh.pFrom, offset f1
    54.     mov sh.fFlags, FOF_ALLOWUNDO
    55.     mov sh.fAnyOperationsAborted, FALSE
    56.     invoke SHFileOperation, addr sh
    57.    
    58.     .endif
    59.     .ENDIF
    60.         xor eax, eax
    61.     ret
    62. DlgProc endp
    63. end start
    64.  
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    mov sh.pTo,NULL
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    И ещё:

    f1 db "C:\1.txt",0,0 - Должно быть два нуля
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 cresta

    sh.pTo при FO_DELETE игнорируется
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    LastErr ERROR_INVALID_HANDLE (00000006)
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    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 программы работает нормально. Файл удаляется, программа продолжает работать дальше, не вылетая.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Эта ошибка возникает, если буфер завершается не двумя нулями. Файл не находится ф-цией. Потому я и постил про два нуля.
     
  8. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Вот пример рабочей проги. Сам пропарился немеренно, так что, чтобы не было больше ниукого вопросов - выкладываю.

    [​IMG] _1268041732__1.rar
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    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.
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    NoName



    Кстати, пример благополучно не работает. Вылетает при запуске (предлагает отправить отчёт об ошибке Билли).



    Вот погляди пример, может не будет отправлять отчёты :)

    Там же и переключение с одним или двумя нулями сделал.







    [​IMG] _113822357__SHFileOp041027.zip
     
  11. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    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.
     
  12. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 cresta

    Между прочим в своем аттаче мог бы и удалить кучу лишнего хлама, ибо как я знаю хозяева нашего замечательного форума очень нелюбят когда место неправильно расходуется.



    Токо спакойно :)
     
  13. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    И кстати пункт exit в меню у тебя неработает. Я неговорю что это плохо или хорошо. Просто неработает и все.
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    NoName



    Это стандартный диалог, который создаёт RadASM, и необязательно использовать меню Exit. Пример был создан не для демонстрации работы меню, а для демонстрации влияния двух нулей :) Чтобы показать это, необязательно оптимизировать до бесконечности исходник, не так ли?



    Касательно "кучи лишнего хлама" : ты удалил в своём примере эту кучу, возможно поэтому он и не работает.

    Всё было оставлено, чтобы не надо было собирать по частям, всё готово, запустил и получил результат.



    P.S. Если нет msdn, то может не стоит делать категорических заявлений типа
     
  15. _Sysman_

    _Sysman_ Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    50
    Адрес:
    Ukraine
    Всё работает, если указать
    Код (Text):
    1. sh.pTo =NULL


    и завершать строку с именем файла двумя нулями.



    Раз затронили корзину, то может кто-нибудь подскажет, как программно узнать наличие файлов в корзине и как их также, программно, удалить?



    NoName

    Когда смотрел то, что сотворил cresta, неработающим пунктам внимания не придавал (главное в примере - не это). Так что хватит, а то оффтоп получается :)
     
  16. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    да это в некоторой степени оффтоп но тут приницпиальные вопросы вылезли, и я немогу просто так пройти мимо несказав человеку свою точку зрения.



    2 cresta



    Тогда на кой черт там меню? Конечно, может всем на это наплевать, но я лично нелюблю когда присутствуют такие излишества, есть еще одна причина почему критикую.



    Если берешся за мелкие вещи, то старайся делай все по минимуму. Таким образом съэкономишь места на чужом серваке и харде дргуих юзеров.



    Да, в этом случае казалось бы можно было бы принибречь размером, ибо архив занимает всего 25 кб. Но если не обращать внимания на эти мелкие штуки, то это дело плавно перерастает в большее.





    Странно мне казалось что ты сделал это для того, чтобы помочь человеку.





    Я даже не говорил об оптимизации. В этом случае ты хотяб лишние файлы удалил бы, было бы уже хорошо.





    Нет. Я удалил только res и obj. Все работает просто exe собран без второго нуля. Но в сорсе про это написано, так что хватит уже на меня бочку катить.





    Ты мои сообщения вообще читал? Или ты просто инглиша незнаешь?



    "FO_DELETE Deletes the files specified by pFrom (pTo is ignored). " дословно переводится: FO_DELETE Удаляет файлы, указанные в pFrom (pTo, игнорируется).



    2 _Sysman_

    Посомтри SHGetSpecialFolderLocation. Может поможет...
     
  17. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    NoName



    Давай не будем жевать это, надоело уже. Человек получил свой NULL в pTo и два нуля в конце строки, подтвердил, что всё так и есть, как я написал, так чего ещё неймётся?



    _Sysman_



    Очисткой корзины вроде занимается SHEmptyRecycleBin, тут в аттаче описание

    [​IMG] _2099247787__SHEmptyRecycleBin.zip
     
  18. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 cresta

    Договорились
     
  19. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ну и славно :)




    Код (Text):
    1. .data
    2.     lpRoot  db "E:\",0
    3. .code
    4.     invoke SHEmptyRecycleBin,hWnd,ADDR lpRoot,NULL