Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.043 c
14-1117026867
Korvet
2005-05-25 17:14
2005.06.14
Открытие окон в инете.


4-1114104572
Graduz
2005-04-21 21:29
2005.06.14
HInstanse


1-1117283847
illuha
2005-05-28 16:37
2005.06.14
Память


4-1114551913
Mad proger
2005-04-27 01:45
2005.06.14
Неудобства BDE


1-1117437432
41223
2005-05-30 11:17
2005.06.14
Интерфейс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский