![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа удаляет саму себя. Реально ?
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.