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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2007, 10:01   #1
DartMrakkk
Пользователь
 
Регистрация: 04.07.2007
Сообщений: 40
По умолчанию Авто удаление программы

Подскажите, можно ли сделать так, чтоб прога сама себя удалила ???
Доступ - Бог
ICQ: 939-115
DartMrakkk вне форума Ответить с цитированием
Старый 05.07.2007, 10:49   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Код:
var
  BatchFile: TextFile;
  BatchFileName: string;
  TM: Cardinal;
  TempMem: PChar;

begin
  BatchFileName:=ExtractFilePath(ParamStr(0))+ '$$336699.bat';

  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);

  Writeln(BatchFile,':try');
  Writeln(BatchFile,'del "' + ParamStr(0) + '"');
  Writeln(BatchFile,'if exist "' + ParamStr(0) + '" goto try');
  Writeln(BatchFile,'del "' + BatchFileName + '"');
  CloseFile(BatchFile);

  TM:=70;
  GetMem (TempMem,TM);
  GetShortPathName (pchar(BatchFileName), TempMem, TM);
  BatchFileName:=TempMem;
  FreeMem(TempMem);

  winexec(pchar(BatchFileName),sw_hide);

  halt;
Проблема будет только с русскими путями до исполняемого файла, думаю справитесь
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 05.07.2007, 10:50   #3
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Цитата:
Цитата:
Очевидно что под Win32 удаление работающего кода невозможно. На время выполнения он просто добавляется к swap файлу - т.е. винды при нехватки памяти данные программы (массив переменных) сбрасывают в Swap (Page) файл, а сам код программы просто уничтожается из памяти, при возобновлении процесса, недостающие куски кода опять считываются из исходного файла. Понятно, что изменение файла пока его код выполняется будет иметь катастрофичные последствия, поэтому винды при запуске программы считают DLL или EXE файл по сути куском файла подкачки и запрещают любые манипуляции над ним. Кстати именно по этой причине все инсталляторы начинают свою работу с операции "Preparing to install", которая делает очень простую вещь - сам инсталлятор копируется во временную папку и перезапускает себя уже с винта, чтоб предотвратить крах системы при смене дискетты или CD. По этой же причине программы упакованные любыми EXE упаковщиками требуют больше памяти для запуска - так как загружается в память и исходный компрессированный код и декомпрессированный поток... Но несмотря на все сказанное можно удалить файл из "самого себя" при помощи маленькой хитрости: мы создаем и запускаем BAT файл - который и удалит программу, а саму программу закрываем, как только система "отпустит" файл - файл будет удален и затем BAT файл удалит самого себя. Пользователь всего этого не заметит - он увидит, что после завершении работы файла программы уже нет.
Код:
Uses ShellApi; 
procedure TForm1.FormDestroy(Sender: TObject); 
var f:textFile; 
FileName:String; 
begin 
FileName:=changefileext(paramstr(0),'.bat'); 
assignFile(f,FileName); 
rewrite(f); 
writeln(f,':1'); 
writeln(f,format('Erase "%s"',[paramstr(0)])); 
writeln(f,format('If exist "%s" Goto 1',[paramstr(0)])); 
writeln(f,format('Erase "%s"',[FileName])); 
closefile(f); 
ShellExecute(Handle, 'Open', PChar(FileName), nil, nil, sw_hide); 
end;
Alex21 вне форума Ответить с цитированием
Старый 05.07.2007, 10:50   #4
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

И такой вариант:
Код:
uses  
  Windows, SysUtils;  
procedure DeleteMe;  
var  
  BatchFile: TextFile;  
  BatchFileName: string;  
  ProcessInfo: TProcessInformation;  
  StartUpInfo: TStartupInfo;  
begin  
  { создаём бат-файл в директории приложения } 
  BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat';  
  { открываем и записываем в файл } 
  AssignFile(BatchFile, BatchFileName);  
  Rewrite(BatchFile);  
  Writeln(BatchFile, ':try');  
  Writeln(BatchFile, 'del "' + ParamStr(0) + '"');  
  Writeln(BatchFile,  
    'if exist "' + ParamStr(0) + '"' + ' goto try');  
  Writeln(BatchFile, 'del "' + BatchFileName + '"');  
  CloseFile(BatchFile);  
  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);  
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;  
  StartUpInfo.wShowWindow := SW_HIDE;  
  if CreateProcess(nil, PChar(BatchFileName), nil, nil,  
     False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,  
     ProcessInfo) then  
  begin  
    CloseHandle(ProcessInfo.hThread);  
    CloseHandle(ProcessInfo.hProcess);  
  end;  
end;
Alex21 вне форума Ответить с цитированием
Старый 05.07.2007, 10:51   #5
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

И еще способ:
Код:
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;
Alex21 вне форума Ответить с цитированием
Старый 05.07.2007, 10:51   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

про последнее ошибаетесь. Не будет работать
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 05.07.2007, 13:54   #7
DartMrakkk
Пользователь
 
Регистрация: 04.07.2007
Сообщений: 40
По умолчанию

Вот сам исходник и исполняемый файл....
Компилируется нормально, работать отказывается...
Вложения
Тип файла: rar Daletemyself.rar (161.4 Кб, 29 просмотров)
Доступ - Бог
ICQ: 939-115
DartMrakkk вне форума Ответить с цитированием
Старый 05.07.2007, 14:02   #8
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Работает. Внимательно читайте мой пост с комментариями.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 05.07.2007, 14:20   #9
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Твой пример исправно работает, НО ПУТЬ К ФАЙЛУ НЕ ДОЛЖЕН СОДЕРЖАТЬ РУССКИХ СИМВОЛОВ!!!!
Из проекта не надо пробовать удалить!!!! Скомпилируй, скопируй ЕХЕ в другое место (про путь не забудь) от туда и запускай.

Вот мой примерчик, так состряпал по ходу...
Вложения
Тип файла: rar Primer_Killer_EXE.rar (6.5 Кб, 46 просмотров)

Последний раз редактировалось Alex21; 05.07.2007 в 14:41. Причина: Медленно печатаю )))
Alex21 вне форума Ответить с цитированием
Старый 08.01.2008, 19:45   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А у меня вот что получилось:
Код:
var mystr: TStringList;
begin
mystr:=TStringList.Create;
mystr.Add('del '+ParamStr(0));
mystr.Add('0123.bat');
mystr.SaveToFile('123.bat');
mystr.Clear;
//второй файлик - чтоб совсем врага запутать :)
mystr.Add('del 123.bat');
mystr.SaveToFile('0123.bat'); 
mystr.Free;
Close;
Shellexecute(application.Handle,'Open','123.bat', nil,nil,SW_HIDE);
end;

Последний раз редактировалось mihali4; 08.01.2008 в 19:51.
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как зделать авто выполнение Editor Общие вопросы Delphi 5 27.04.2008 21:01
Авто-Прокрутка в Memo eks-s Общие вопросы Delphi 2 18.04.2008 01:52
НДФЛ+продажа авто Elm0 Свободное общение 0 05.04.2008 17:07
Авто-фильтр, Нужна помощь jungo Microsoft Office Excel 2 23.03.2008 11:17
Создание авто- загрузочной проги Gaist Общие вопросы Delphi 3 13.06.2007 13:09