Форум: "Основная";
Текущий архив: 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 Budapestaprocedure 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.037 c