Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Удаление программой самой себя |
Автор: kruchinin 30.4.2003, 18:23 |
Ситуация: Программа завершает свою работу, и если в ней произошли какие-то определенные действия, то она удаляет саму себя. Как это сделать? |
Автор: Step 30.4.2003, 18:31 |
на ходу клипай бат файл в котором делай задержку, потом из своей проги вызывай его, и сразу закрывай прогу, пока будет идти задержка, твоя прога закроется и потом удалиться Недостаток, останется бат файл |
Автор: HexoGenus 30.4.2003, 20:55 |
Можно стереть его во время следующего запуска Windows, добавив ключ RunOnce: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce Пример (извините он на дельфи надеюсь переделаете): uses Registry; procedure TForm1.Button1Click(Sender: TObject); var reg: TRegistry; begin reg := TRegistry.Create; with reg do begin RootKey := HKEY_LOCAL_MACHINE; LazyWrite := false; OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', false); WriteString('Delete Me!','command.com /c del FILENAME.EXT'); CloseKey; free; end; end; |
Автор: acp 30.4.2003, 21:12 | ||
А вы что, не знаете, что батник может удалять сам себя? ![]() |
Автор: Step 2.5.2003, 17:12 |
acp даже так, так это вооще круто можно еще в автозагрузку команду на удаление пихнуть |
Автор: DENNN 2.5.2003, 17:36 | ||
Маньяки ![]() |
Автор: HexoGenus 3.5.2003, 01:01 | ||
команда из указанного мною ключа реестра будет выполнена только раз при следующем старте виндозы и потом виндоза сама эту команду из реестра вырежет... это как раз то что вы в батничке в автозагрузке собрались прописывать ![]() хотя если результат тот же то какая по сути разница? хотя... кстати учтите что место расположения папки автозагрузки может очень даже сильно меняться особенно при использовании профилей... ![]() |
Автор: man2002ua 3.5.2003, 09:34 |
определенно маньяки. я писал .com файл в ресурс - потом извлекал его, запускал. Тоже что и батник, только окна не мелькают ![]() |
Автор: HexoGenus 4.5.2003, 10:40 | ||
![]() то же скажете маньяки ![]() да вы нас ночью не видели... Теперь серьезно... что будет если твой com файл во время исполнения повиснет ![]() кто его удалит? Одной из причин по которой может потребоваться грохать программу на компе, это несовместимость с аппаратурой... а это как раз тот случай когда она может повиснуть... так что все зависит от того что в данной реализации будет важнее: быстрое удаление или надежное удаление ![]() |
Автор: man2002ua 5.5.2003, 10:13 |
как это - повиснет? Там только один цикл (можно не бесконечный) в к-м удаляется exe Файл... |
Автор: DENNN 5.5.2003, 12:38 |
Я не много не в курсе: можно создать процесс без экзешника? Тогда этот второй процесс может удалить файл, когда он более не понадобится. |
Автор: HexoGenus 5.5.2003, 13:35 | ||
Читай тему ![]() "Программа выполнит определенные действия" и в случае если результат автора не радует программа удалит себя ![]() я и не говорил что повиснет твой com файл... я имею в виду возможность того что "определенные действия" приведут к зависанию и до твоей функции самоуничтожения (кстати не такой простой в своем исполнении) программа просто не дойдет... в моем варианте программа просто пропишет строчку в реестр и выполняет свои действия... если что не так она либо виснет либо благополучно завершается но пользователь в любом случае уверен что при следующей загрузке компа он файл уже не увидит ![]() А если программа после выполнения действий решила остаться на компе она просто удаляет строчку из реестра... Кстати твой способ мне тоже нравится, но кажется с бат файлом проще, и разве нельзя бат файл запустить в свернутом окне? Теперь по поводу вопроса Я не много не в курсе: можно создать процесс без экзешника? насколько я в курсе все процессы привязываются к своему приложению и пока они выполняются программу грохнуть нельзя... хотя кажется где-то видел примерчик программы которая грохала себя используя что то вроде этого примера удаления непустой папки SHFILEOPSTRUCT sh; sh.hwnd=Form1->Handle; sh.wFunc = FO_DELETE; sh.pFrom = "c:\\test\0"; sh.pTo = "NULL"; sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; sh.hNameMappings = 0; sh.lpszProgressTitle = NULL; SHFileOperation (&sh); ForceDirectories("C:\\Test"); |
Автор: Fantasist 5.5.2003, 16:59 |
Не так давно (хотя нет, давно) я прочитал на delphimasters.ru, что в принципе грохнуть запущенный файл можно, надо только закрыть memory-mapped хендл этого файла, который windows автоматически создает при запуске программы (во всяком случае в Win98/NT). |
Автор: Leonid 6.5.2003, 01:12 | ||||
Может быть я ошибаюсь, но мне кажется, что если "определенные действия" приведут к зависанию, значит программа не выполнила свою задачу и, следовательно, не должна самоуничтожиться. По этому я предлагаю такой вариант:
Я создал проект на базе диалога(просто для проверки) и поместил эту функцию в обработчик кнопки "ОК". Всё сработало замечательно. Наслаждайтесь. Желаю удачи. |
Автор: HexoGenus 6.5.2003, 15:02 | ||
Или она просто не может выполнить свою задачу на данном компьютере и следовательно должна самоуничтожиться ![]() |
Автор: DENNN 14.5.2003, 18:04 |
Попалось тут недавно на глаза: http://www.codeproject.com/file/cpselfdestruct2.asp |
Автор: Monty 14.5.2003, 18:52 |
это не секрет, создается BAT файл, с циклом... надо еще его скрыть... . У меня такой вопрос: ЗАЧЕМ это надо? |
Автор: kruchinin 15.5.2003, 20:08 |
Для написания uninstall-программы |
Автор: Monty 15.5.2003, 23:15 |
ах вот зачем ![]() в дирикторию TEMP запускала этот файл а сама закрывалась, та копия запускается и удаляет заданные файлы, по крайней мере так делает NullSoft ![]() |
Автор: Dov 16.5.2003, 01:20 | ||
http://www.sources.ru/cpp/faq6.shtml |
Автор: VitSoft 20.5.2003, 11:20 |
http://www.dev.vitgroup.com/index.php?module=subjects&func=viewpage&pageid=95 Но я все же не понимаю зачем это надо, "если это не вирус" а если писать инсталер, то есть процесс который все раскрутил, запустил, оно отработало и он почистил за собой Тем более, что это еще одно колесо !! инсталеров уже так много, что писать еще один, нету смысла ИМХО. |
Автор: Step 20.5.2003, 11:37 |
VitSoft защитить свои авторские права видать хочет |