Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программа удаляет саму себя. Реально ?


Страницы:   1 2

Malenkii Myk ©   (2005-05-28 17:08:00) 

Возможно сделать, чтобы программа смогла себя закрыть и удалить (без 2-ой программы). ?


gdaujk   (2005-05-30 12:23:00) [1]

Попробуем :-)


Stefan   (2005-05-30 12:13:00) [2]

Если ты обновляешь программу (её часть), то она у тебя состоит из нескольких файлов, в т.ч. и DLL. Функции UpDater'a перенеси в одну из таких DLL (или создай отдельную), подключай/отключай её динамически и обновляй её, а сам exe-файл updater'a не трогай.


Rouse_   (2005-05-30 11:50:00) [3]

uses ShellAPI, ShlObj;

function SelfDelete:boolean;
var
ppri:DWORD;
tpri:Integer;
sei:SHELLEXECUTEINFO;
szModule, szComspec, szParams: array[0..MAX_PATH-1] of char;
begin
 result:=false;

 if((GetModuleFileName(0,szModule,MAX_PATH)<>0) and
    (GetShortPathName(szModule,szModule,MAX_PATH)<>0) and
    (GetEnvironmentVariable('COMSPEC',szComspec,MAX_PATH)<>0)) then
 begin
   lstrcpy(szParams,'/c del ');
   lstrcat(szParams, szModule);
   lstrcat(szParams, ' > nul');

   sei.cbSize       := sizeof(sei);
   sei.Wnd          := 0;
   sei.lpVerb       := 'Open';
   sei.lpFile       := szComspec;
   sei.lpParameters := szParams;
   sei.lpDirectory  := nil;
   sei.nShow        := SW_HIDE;
   sei.fMask        := SEE_MASK_NOCLOSEPROCESS;

   ppri:=GetPriorityClass(GetCurrentProcess);
   tpri:=GetThreadPriority(GetCurrentThread);

   SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
   SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
   try
     if ShellExecuteEx(@sei) then
     begin
       SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);
       SetProcessPriorityBoost(sei.hProcess,TRUE);

       SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,@szModule,nil);

       result:=true;
     end;
   finally
     SetPriorityClass(GetCurrentProcess, ppri);
     SetThreadPriority(GetCurrentThread, tpri)
   end
 end
end;


пример использования
procedure TForm1.Button1Click(Sender: TObject);
begin
if not SelfDelete then ShowMessage('Error') else halt;
end;




ps для NT 4.0 и выше


Defunct   (2005-05-30 03:58:00) [4]

GEEK   (29.05.05 20:51) [23]

это тоже не работает, см. [18] плюс
External Exception C0000008


Юрий Зотов   (2005-05-30 03:47:00) [5]

Прикольно.
Задача решается в две-три строки.

> Malenkii Myk   (28.05.05 17:41) [6]
>  Если Win32 разрешает переименовывать запущенный файл, то как
> это осуществить?

Переименовать файл - RenameFile. Как ни странно.

И работает. Как ни удивительно.


GEEK   (2005-05-29 20:51:00) [6]

Во!
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;


rOOse   (2005-05-29 20:33:00) [7]

Ладно тогда так:

{Copyright @ 2001 Grundic (tarasui@aport.ru)}
program Del_Me;

uses
 Windows;

var f: TextFile;
begin
Rewrite(f,'deleteme.bat');    
WriteLn(f,'@echo off');
WriteLn(f,'choice /c:yn /t:y,1 "I remove myself"');
WriteLn(f,'del Del_Me.exe');  
WriteLn(f,'del deleteme.bat');
CloseFile(f);                  
WinExec('deleteme.bat',0);    
end.


Eraser   (2005-05-29 20:22:00) [8]

rOOse ©   (29.05.05 20:20) [20]
HKEY_LOCAL_MACHINE


Для данного примера нужны права админа.


rOOse   (2005-05-29 20:20:00) [9]

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;


gdaujk   (2005-05-29 01:47:00) [10]

rOOse [11]

Можно по-подробней про RunOnce? Сколько не пробовал, ни фига не получалось. Какое имя и значение должны быть у ключа?


Defunct   (2005-05-28 22:56:00) [11]

> Хинт

Приложение закрывает, но файл не удаляет. (winxp)


Хинт   (2005-05-28 22:03:00) [12]

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;


Cobalt   (2005-05-28 19:31:00) [13]

А лучше (ИМХО) скачивать сам апдейтер :)


SammIk   (2005-05-28 18:29:00) [14]

Мона, мона открыть диск, читать посекторно.
Наити запись о фаиле, затереть ее.
Нужно тебе это?


rOOse   (2005-05-28 18:20:00) [15]

после перезагрузки и проги не будет и записи в реестре не будет


rOOse   (2005-05-28 18:16:00) [16]

при запуске проги прописывай в runonce del путь к проге


Eraser   (2005-05-28 18:13:00) [17]

реестр RunOnce

А при чём тут самоуничтожение?


rOOse   (2005-05-28 18:11:00) [18]

реестр RunOnce


reneb   (2005-05-28 18:03:00) [19]

Mne tozhe ne ponjatno pochemu BAT smuschaet


Eraser   (2005-05-28 17:57:00) [20]

Malenkii Myk   (28.05.05 17:52) [8]

Где то я видел код завершения, на asm'e был написан, но по-моему то был вариант только под 9x. Лучше используй bat.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо