Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2009, 22:57   #1
DeDoK
Форумчанин
 
Аватар для DeDoK
 
Регистрация: 05.11.2007
Сообщений: 392
По умолчанию самоудаление

Как сделать самоудаление программы по нажатию на кнопку?
DeDoK вне форума Ответить с цитированием
Старый 08.10.2009, 00:50   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Вот вроде такое:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   F: TextFile;
   Temp, AppName: string;
begin
      Temp:= 'delete.bat';
      AppName:= ExtractFileName(ParamSTR(0));
      AssignFile(F, Temp);
      Rewrite(F);
      Writeln(F, 'del ' + AppName);
      Writeln(F, 'del ' + Temp);
      CloseFile(F);
      WinExec(PCHar(Temp),SW_HIDE);
      Halt;
end;
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 08.10.2009, 05:00   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Можно еще так (заодно немного ассемблера):
Код:
procedure DeleteSelf;
var
  module: HModule;
  buf: array [0..MAX_PATH - 1] of char;
  p: ULong;
  hKrnl32: HModule;
  pExitProcess,
  pDeleteFile,
  pFreeLibrary: pointer;
begin
  module := GetModuleHandle(nil);
  GetModuleFileName(module, buf, SizeOf(buf));
  CloseHandle(THandle(4));
  p := ULONG(module) + 1;
  hKrnl32 := GetModuleHandle('kernel32');
  pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
  pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');
  pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');
  asm
    lea eax, buf
    push 0
    push 0
    push eax
    push pExitProcess
    push p
    push pDeleteFile
    push pFreeLibrary
    ret
  end;
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.10.2009, 12:40   #4
Usov
Форумчанин
 
Аватар для Usov
 
Регистрация: 29.09.2009
Сообщений: 228
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Можно еще так (заодно немного ассемблера)
Проверил на на D7 - при нажатии кнопки с вызовом этой процедуры программа закрывается но не удаляется с диска.

Последний раз редактировалось Usov; 08.10.2009 в 12:45.
Usov вне форума Ответить с цитированием
Старый 08.10.2009, 13:39   #5
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
По умолчанию

Цитата:
Проверил на на D7 - при нажатии кнопки с вызовом этой процедуры программа закрывается но не удаляется с диска.
Цитата:
WinExec(PCHar(Temp),SW_HIDE);
Потому что нужно УЖЕ ДАВНО ПЕРЕЙТИ на ShellExecute всместо WinExec.
И тогда всё будет работать.

Вот:
Код:
ShellExecute(Application.Handle,’open’,’Delete.bat’,nil,nil,SW_ShowNormal);
Получил помощь — отблагодарил.

Последний раз редактировалось GenniY; 08.10.2009 в 13:50.
GenniY вне форума Ответить с цитированием
Старый 08.10.2009, 14:56   #6
Usov
Форумчанин
 
Аватар для Usov
 
Регистрация: 29.09.2009
Сообщений: 228
По умолчанию

Цитата:
Сообщение от GenniY Посмотреть сообщение
Потому что нужно УЖЕ ДАВНО ПЕРЕЙТИ на ShellExecute всместо WinExec.
Я цитировал artemavd, а в его примере этого метода нет. Метод с созданием доп. файла не интересен так как подобный механизм у меня уже работает в обновлении версии программы.

Последний раз редактировалось Usov; 08.10.2009 в 15:10.
Usov вне форума Ответить с цитированием
Старый 08.10.2009, 17:11   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сам не проверял, ибо уж очень тема замороченная, но
можно попробовать, вот тут - "Распаковка из .exe" выкладывался код, который позволяет запустить exe-файл, сохранённый в ресурсах. теоретически этот запущенный процесс может грохнуть родительский (найти родительский процесс, закрыть его и грохнуть exe)...

а вообще ОЧЕНЬ МНОГО ссылок по теме вот тут:
Удалить exe файл
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.10.2009, 17:29   #8
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
сам не проверял, ибо уж очень тема замороченная, но
можно попробовать, вот тут - "Распаковка из .exe" выкладывался код, который позволяет запустить exe-файл, сохранённый в ресурсах. теоретически этот запущенный процесс может грохнуть родительский (найти родительский процесс, закрыть его и грохнуть exe)...

а вообще ОЧЕНЬ МНОГО ссылок по теме вот тут:
Удалить exe файл
Интересная идея на счёт удаления родителя )) нужно будет попробовать )
Lime вне форума Ответить с цитированием
Старый 08.10.2009, 17:38   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Интересная идея на счёт удаления родителя )) нужно будет попробовать )
спасибо за столь высокую оценку моей идеи!
Но, лично я бы не взялся реализовывать - тут нужно Винду изнутри знать и на WinAPI программить...
И, к сожалению, лично у меня нет 100% уверенности, что идёя сработает!

p.s. по приведённой мною выше ссылке много идей и примеров... только походить/поизучать надо..

p.p.s. а какая прелесть была под MS DOS - там программка сама себя удаляла без всяких вопросов и проблем: Assign(f, ExeFile); Erase(f) - и ВСЁ!!!
и архиватор, лежащий в папке лёгко сам себя запаковывал в архив по команде:
arj.exe m Archiv *.*

Последний раз редактировалось Serge_Bliznykov; 08.10.2009 в 17:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.10.2009, 18:36   #10
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Хорошо

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
спасибо за столь высокую оценку моей идеи!
Но, лично я бы не взялся реализовывать - тут нужно Винду изнутри знать и на WinAPI программить...
И, к сожалению, лично у меня нет 100% уверенности, что идёя сработает!

p.s. по приведённой мною выше ссылке много идей и примеров... только походить/поизучать надо..
Хмм , а мне кажеться что можно реализовать даже копипастом
Гдето надалеко видел пост о запуске приложения из ресурса прямо "на лету" - без сохранения на диске.
После запуска приложения из ресурса(например с параметрами путь ++) родитель выгружается из памяти и его можно будет удалить без проблем ...
Lime вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц