Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата
Недостаток, останется бат файл


А вы что, не знаете, что батник может удалять сам себя? smile.gif

Автор: Step 2.5.2003, 17:12
acp даже так, так это вооще круто



можно еще в автозагрузку команду на удаление пихнуть

Автор: DENNN 2.5.2003, 17:36
Цитата
можно еще в автозагрузку команду на удаление пихнуть

Маньяки smile.gif

Автор: HexoGenus 3.5.2003, 01:01
Цитата(Step @ 2.5.2003, 14:12)
можно еще в автозагрузку команду на удаление пихнуть

команда из указанного мною ключа реестра будет выполнена только раз при следующем старте виндозы и потом виндоза сама эту команду из реестра вырежет...
это как раз то что вы в батничке в автозагрузке собрались прописывать smile.gif
хотя если результат тот же то какая по сути разница?
хотя... кстати учтите что место расположения папки автозагрузки может очень даже сильно меняться особенно при использовании профилей... tounge.gif

Автор: man2002ua 3.5.2003, 09:34
определенно маньяки.
я писал .com файл в ресурс - потом извлекал его, запускал. Тоже что и батник, только окна не мелькают smile.gif, а com - может самоудаляться.

Автор: HexoGenus 4.5.2003, 10:40
Цитата(man2002ua @ 3.5.2003, 06:34)
определенно маньяки.
я писал .com файл в ресурс - потом извлекал его, запускал. Тоже что и батник, только окна не мелькают smile.gif, а com - может самоудаляться.

biggrin.gif
то же скажете
маньяки smile.gif
да вы нас ночью не видели...
Теперь серьезно... что будет если твой com файл во время исполнения повиснетconfused.gif
кто его удалит?
Одной из причин по которой может потребоваться грохать программу на компе, это несовместимость с аппаратурой... а это как раз тот случай когда она может повиснуть... так что все зависит от того что в данной реализации будет важнее: быстрое удаление или надежное удаление smile.gif

Автор: man2002ua 5.5.2003, 10:13
как это - повиснет? Там только один цикл (можно не бесконечный) в к-м удаляется exe Файл...

Автор: DENNN 5.5.2003, 12:38
Я не много не в курсе: можно создать процесс без экзешника?

Тогда этот второй процесс может удалить файл, когда он более не понадобится.

Автор: HexoGenus 5.5.2003, 13:35
Цитата(man2002ua @ 5.5.2003, 07:13)
как это - повиснет? Там только один цикл (можно не бесконечный) в к-м удаляется exe Файл...

Читай тему smile.gif
"Программа выполнит определенные действия"
и в случае если результат автора не радует программа удалит себя smile.gif
я и не говорил что повиснет твой com файл...
я имею в виду возможность того что "определенные действия" приведут к зависанию и до твоей функции самоуничтожения (кстати не такой простой в своем исполнении) программа просто не дойдет... в моем варианте программа просто пропишет строчку в реестр и выполняет свои действия... если что не так она либо виснет либо благополучно завершается но пользователь в любом случае уверен что при следующей загрузке компа он файл уже не увидит smile.gif
А если программа после выполнения действий решила остаться на компе она просто удаляет строчку из реестра...

Кстати твой способ мне тоже нравится, но кажется с бат файлом проще, и разве нельзя бат файл запустить в свернутом окне?

Теперь по поводу вопроса
Я не много не в курсе: можно создать процесс без экзешника?

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

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
Цитата
я имею в виду возможность того что "определенные действия" приведут к зависанию
и до твоей функции самоуничтожения (кстати не такой простой в своем исполнении) программа
просто не дойдет...

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

void DeleteSelf()
{
  const int nSize = MAX_PATH;
  char        fileName[nSize];
  char        bufer[nSize];
  CString   batFile;
  CString   batText = "@echo off\n:try\ndel ";

  GetModuleFileName(NULL, fileName, nSize);
  batFile    = ((GetEnvironmentVariable("Temp", bufer, nSize) > 0) ? bufer : "C:");
  batFile  += "\deleteSelf.bat";
  batText += fileName;
  batText += "\nif exist ";
  batText += fileName;
  batText += " goto try\ndel ";
  batText += batFile;

  DWORD NumOfBytes;
  HANDLE hbat = CreateFile(batFile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ |
  FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  WriteFile(hbat, batText, strlen(batText), &NumOfBytes, NULL);
  CloseHandle(hbat);

  STARTUPINFO                  si;
  PROCESS_INFORMATION pi;
 
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  si.wShowWindow = SW_HIDE;
  si.dwFlags = STARTF_USESHOWWINDOW;
 
  CreateProcess(NULL, LPSTR(LPCTSTR(batFile)), NULL, NULL, FALSE,
 IDLE_PRIORITY_CLASS | DETACHED_PROCESS, NULL, NULL, &si, &pi);
}


Я создал проект на базе диалога(просто для проверки) и поместил эту функцию в
обработчик кнопки "ОК".
Всё сработало замечательно.
Наслаждайтесь. Желаю удачи.


Автор: HexoGenus 6.5.2003, 15:02
Цитата(Leonid @ 5.5.2003, 22:12)
Может быть я ошибаюсь, но мне кажется, что если "определенные действия" приведут к зависанию,
значит программа не выполнила свою задачу и, следовательно, не должна самоуничтожиться.

Или она просто не может выполнить свою задачу на данном компьютере и следовательно должна самоуничтожиться tounge.gif

Автор: 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
ах вот зачем smile.gif, есть еще один способ: надо чтоб программа при запуске копировала сама себя
в дирикторию TEMP запускала этот файл а сама закрывалась, та копия запускается и удаляет
заданные файлы, по крайней мере так делает NullSoft smile.gif .... ну как ?

Автор: 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 защитить свои авторские права видать хочет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)