Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

Программа удаляет саму себя. Реально ?   Найти похожие ветки 

 
Malenkii Myk   (2005-05-28 17:08) [0]

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


 
KilkennyCat ©   (2005-05-28 17:10) [1]

да.


 
-=XP=- ©   (2005-05-28 17:11) [2]

Даже могу привести пример такой программы: format.com


 
Malenkii Myk   (2005-05-28 17:22) [3]

Так реально или нет ?
Если реально, тот каким способом это осуществить...

К примеру... Я пишу Updater, который скачивает с сервера обновления других файлов, но время от времени надо обновлять и сам Updater. Типа скачивается новая версия этого приложения и старая версия должна закрываться, удалять, переименовываться и запускаться Ж) Во как! Ж)


 
Eraser ©   (2005-05-28 17:34) [4]

Malenkii Myk   (28.05.05 17:22) [3]
Если реально, тот каким способом это осуществить...


Проще всего через bat файл.


 
Юрий Зотов ©   (2005-05-28 17:36) [5]

> Malenkii Myk

Старая версия переименовывает свой файл (Win32 это разрешает), скачивает и запускает новую, после чего завершается - а запущенная новая версия удаляет старую. И все проблемы.


 
Malenkii Myk   (2005-05-28 17:41) [6]

Если Win32 разрешает переименовывать запущенный файл, то как это осуществить? Через стандартый Rename вроде этого не сделать...


 
reneb   (2005-05-28 17:47) [7]

Ja eto delaju tak.
Napishu bat-file i zapuskaju ego
bat-file staraetsja steret" exe emu eto udastsja kogda zakachivaetsja exe
Posle etogo mozhes i bat-file steret";

Privet iz Budapesta

procedure TForm.Button1Click(Sender: TObject);
var
 f: TextFile;
 filename: string;
 pi: TProcessInformation;
 si: TStartupInfo;
begin
   filename:=ChangeFileExt(Application.ExeName, ".bat");
   AssignFile(f, filename);
   Rewrite(f);
   Writeln(f, ":label1");
   Writeln(f, "del "" + Application.ExeName + """);
   Writeln(f, "if exist "" + Application.ExeName + """ + " goto label1");
   Writeln(f, "del "" + filename + """);
   CloseFile(f);

   FillChar(si, SizeOf(TStartupInfo), 0);
   si.dwFlags:=STARTF_USESHOWWINDOW;
   si.wShowWindow:=SW_HIDE;

   if CreateProcess(nil, PChar(filename), nil, nil, false, IDLE_PRIORITY_CLASS, nil, nil, si, pi) then begin
     CloseHandle(pi.hThread);
     CloseHandle(pi.hProcess);
   end;
   Close;
end;


 
Malenkii Myk   (2005-05-28 17:52) [8]

Ну через BAT файл не очень прикольно, хотелось бы чтобы всё на программном уровне работало


 
Eraser ©   (2005-05-28 17:57) [9]

Malenkii Myk   (28.05.05 17:52) [8]

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


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

Mne tozhe ne ponjatno pochemu BAT smuschaet


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

реестр RunOnce


 
Eraser ©   (2005-05-28 18:13) [12]

реестр RunOnce

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


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

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


 
rOOse ©   (2005-05-28 18:20) [14]

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


 
SammIk ©   (2005-05-28 18:29) [15]

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


 
Cobalt ©   (2005-05-28 19:31) [16]

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


 
Хинт ©   (2005-05-28 22:03) [17]

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;


 
Defunct ©   (2005-05-28 22:56) [18]

> Хинт

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


 
gdaujk ©   (2005-05-29 01:47) [19]

rOOse [11]

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


 
rOOse ©   (2005-05-29 20:20) [20]

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;


 
Eraser ©   (2005-05-29 20:22) [21]

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


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


 
rOOse ©   (2005-05-29 20:33) [22]

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

{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.


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

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



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

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

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

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

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


 
Defunct ©   (2005-05-30 03:58) [25]

GEEK   (29.05.05 20:51) [23]

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


 
Rouse_ ©   (2005-05-30 11:50) [26]

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 и выше


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

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


 
gdaujk ©   (2005-05-30 12:23) [28]

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



Страницы: 1 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.026 c
3-1115551746
Zahar
2005-05-08 15:29
2005.06.14
Помогите с SQL-запросом.


3-1115290127
Black Fox
2005-05-05 14:48
2005.06.14
Ошибка доступа к метафайлу


3-1115285057
Azz
2005-05-05 13:24
2005.06.14
Помогите разобраться, Отцы!


14-1116824427
Некто
2005-05-23 09:00
2005.06.14
Фанатам Carmageddon а


11-1099049285
Юрий Ж.
2004-10-29 15:28
2005.06.14
Не могу скачать новую версию KOL.