Удалить файл

Тема в разделе "WASM.BEGINNERS", создана пользователем Aspire, 15 авг 2007.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    assorted
    известные способы, не катят в wxp. (читаем james catch'a)
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Aspire
    и? ExitProcess состоит из

    Код (Text):
    1. ZwTerminateProcess( 0, ExitCode );
    2. LdrShutdownProcess();
    3. CsrClientCallServer( apimsg /* пустой буфер */, 0, 0x10003, 4 );
    4. ZwTerminateProcess( -1, ExitCode );
    После второго вызова ZwTerminateProcess больше ничего не исполняется - процесс убит. Так что насчет адреса возврата я немного недопонял..
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Great Тогда ждем объяснений вместе...
     
  4. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Да, малость дезинформировал. То было для DLL. там FreeLibrary, а не ExitProcess.
     
  5. pris0ner

    pris0ner New Member

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

    Итак, задача такая -- я создаю файл, с которым надо выполнить действия, ассоциированные с ним в системе по умолчанию. Т.е. если это jpg файл, то вызвать для него просмотрщик, установленный в системе... А после этого нужно уничтожить тот файл, из которого была запущена моя программа.

    Вначале все было просто, создаю батник, который уничтожает мою программу. И выполняю его с помощью команды ShellExecute. Файл уничтожается нормально.
    Но вот когда я добавил функцию показа созданного файла (я его тоже показываю с помощью второй функции ShellExecute), то мой файлик перестал уничтожаться!

    Убираем функцию показа файла -- он опять уничтожается нормально.
    Более того, я заметил, что если я трассирую свою программу с помощью отладчика, то даже в том случае, когда у меня нет функции показа файла, то мой батник не может уничтожить мою программу!
    Создается такое впечатление, что он пытается уничтожить файл, но он еще занят процессом. А когда процесс завершается, то он успевает это сделать. А под отладчиком -- нет...
    Господа! У меня уже крыша едет!
     
  6. pris0ner

    pris0ner New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    43
    Хорошо, я уже начинаю подозревать что создание второго процесса не такое уж и сложное занятие, чтобы потереть исходный файл.
    В связи с этим два вопроса -- С какими параметрами надо использовать OpenProcess? что-то я недопонял. Может имелось ввиду CreateProcess?

    Вопрос второй. Должен ли созданный процесс дожидаться завершения первого процесса, чтобы потереть его файл?

    Моя цель -- создать код, который все остальные смогли бы использовать в своих программах, не утруждаясь особо на подобные изыски...
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    pris0ner
    А можно глянуть на Ваш bat-файл? Может разумно было бы создавать его с таким содержимым:
    Код (Text):
    1. @ECHO OFF
    2. :tryagain
    3. DEL MY.EXE
    4. IF EXIST MY.EXE GOTO tryagain
    5. DEL 1.BAT
    ?
    И тогда удалена Ваша программа будет по своему завершению: не зависимо от того, будет ли она завершена сразу или спустя какое-то время.
     
  8. maestro-ant

    maestro-ant Member

    Публикаций:
    0
    Регистрация:
    23 июл 2006
    Сообщения:
    112
    Все способы палевные! Почему просто не сделать MoveFileEx в папку темп и пометить на удаление, после ребута система его удалит.
     
  9. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    maestro-ant
    Можно поподробнее ? Что именно имелось ввиду ? И чем Ваш способ непалевнее ?
     
  10. pris0ner

    pris0ner New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    43
    батник выглядит так:

    chcp 1251
    del "C:\radasm\Masm\Projects\regstop\regstop\ssd.scr_"
    del "C:\WINDOWS\q2kert90.bat"

    насчет пометки для удаления и перемещения файла,
    то я так полагаю, что если человек получил какой-то файл и у него появились какие-то подозрения, то любой перемещенный файл можно найти. Хотя моя прога все же первым делом себя перемещает. Поэтому я и полагаю что нужно именно удалять себя как можно быстрее.

    Почему и спрашиваю насчет способа с отдельным потоком...

    p.s нельзя ли переименовать тему? чтобы было понятно об удалении какого файла идет речь? а то не все сразу врубаются...
     
  11. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Поддержу. Предлагаю "самоликвидацию".)))
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    pris0ner
    Ну вот и замените батник на мой вариант из 27-го поста, и никаких проблем не будет (разумеется подкорректировать имена файлов нужно, и chcp 1251, соответственно, тоже туда вставить надо).
    Создание нового процесса - не менее "палевно", чем запуск bat-файла, т.к. собственно одно и то же. Единственная разница: имя процесса можно самому выбрать... типа csrss.exe, а для bat-файла это всегда cmd.exe. Но если Ваша программа сразу выгружается после запуска bat, то и cmd.exe вряд ли пропалится, т.к. жить доли секунды будет.
    maestro-ant
    ИМХО еще более "палевно", т.к. до перезагрузки файл будет преспокойно лежать на винте, когда процесс уже будет выгружен.
     
  13. pris0ner

    pris0ner New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    43
    2 Aspire

    тот, кто начал тему, тот и имеет права на ее изменение. Начинал ее некий Aspire. :)
     
  14. pris0ner

    pris0ner New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    43
    огромное спасибо l_inc!

    заменил батник по вашему образцу и все заработало.

    как я сумел разобраться, батник запускается параллельно моему процессу. Пока процесс не закончен, он не может потереть его файл. В первом варианте моей программы процесс успевал завершиться до того, как батник начинал работу. поэтому все работало нормально. Теперь же после внесенных изменений тоже стало все нормально.
    В принципе вещь неочевидная, если привык к линейному исполнению программ... :dntknw:
    Спасибо что помогли разобраться...
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Да не за что. :)
     
  16. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    По поводу chcp - не факт что в системе используется именно кодировка utf8, потому желательно воспользоваться GetACP() + wsprintf().
     
  17. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    А вобще перемещение в temp намного проще и имхо изящнее.