Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
ВнизКак удалить exe Файл после завершения его работы? Найти похожие ветки
← →
Manfred8 (2005-05-10 14:38) [0]Нашел вот процедурку MoveFileEx(PChar(FilePath), nil,
MOVEFILE_DELAY_UNTIL_REBOOT);
но этого не достаточно,хочется чтобы изчезал сразу после выполнения,а не после перезагрузки системы..
← →
Manfred8 (2005-05-10 14:49) [1]ПРоблема решена,поиск рулит неимоверно :)
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=4067
Непосредственно ВО ВРЕМЯ РАБОТЫ - никак. Это противоречит принципам
работы Win32 с памятью, поэтому система не даст этого сделать. Удалить
EXE-файл можно ТОЛЬКО после его завершения.
Но EXE-файл может удалить как бы "сам себя". Например, перед своим
завершением он может записать и стартовать Batch-файл типа:
@echo off
:loop
if not exists ExeName.exe goto done
del ExeName.exe > nul
goto loop
:done
del BatchName.bat > nul
← →
GreatMaster (2005-05-10 15:01) [2]ГОРАЗДО надёжней к Batch-способу добавить чтобы в этот файл перед его удалением чёто записалось.... случайное такое :)
← →
Viktop (2005-05-10 15:09) [3]
program delete;
uses
SysUtils, windows;
var
BatchFile: TextFile;
BatchFileName: string;
TM: Cardinal;
TempMem: PChar;
begin
BatchFileName:=ExtractFilePath(ParamStr(0))+ "$$336699.bat";
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile,":try");
Writeln(BatchFile,"del "" + ParamStr(0) + """);
Writeln(BatchFile,"if exist "" + ParamStr(0) + "" goto try");
Writeln(BatchFile,"del "" + BatchFileName + """);
CloseFile(BatchFile);
TM:=70;
GetMem (TempMem,TM);
GetShortPathName (pchar(BatchFileName), TempMem, TM);
BatchFileName:=TempMem;
FreeMem(TempMem);
winexec(Pchar(BatchFileName),sw_hide);
halt;
end.
← →
Marser © (2005-05-10 16:47) [4]Мне понравился вариант с Королевства Delphi - перед завершением работы приложения с помощью rundll32 загружается DLL, которая по завершении приложения удаляет его файл, а затем выгружается.
А уж DLL можно удалить классически - через BAT, win.ini или ключа RunOnce реестра.
← →
Slawutich © (2005-05-12 13:52) [5]Вот на мой взгляд самый короткий и реальный способ:
на форму поставь Memo и напиши в нем
del Myprogram.exe
del Hana.bat
делаеш Мемо Visible:=false чтоб не мешала.
Дальше под FormClose пишишьmemo1.Lines.SaveToFile("Hana.bat");
ShellExecute(Application.Handle, nil,"Hana.bat", nil, nil, SW_SHOWNORMAL);
И после закрытия BAT файл грохнит сперва прогу а потом уже и себя самого.
И не нужны заумные здаровые скрипты "Краткость сестра таланта".
← →
Virgo_Style © (2005-05-12 14:02) [6]Slawutich © (12.05.05 13:52) [5]
А как .bat-файл узнает, что уже можно грохнуть? :o)
← →
Amoeba © (2005-05-12 14:19) [7]
> Вот на мой взгляд самый короткий и реальный способ:
> на форму поставь Memo и напиши в нем
> del Myprogram.exe
> del Hana.bat
> делаеш Мемо Visible:=false чтоб не мешала.
Нафига Memo! StringList вполне достаточно.
← →
Style © (2005-05-12 15:03) [8]//типа того
WinExec(pchar("rundll32.exe pkiller.dll AbsoluteKillProcessFile " + IntToStr(GetCurrentProcessID)), SW_SHOW);
//DLL
library pkiller;
uses
SysUtils, TlHelp32, PSApi, Windows;
function GetProcessFileName(ProcessID: cardinal): string;
var
pe: TProcessEntry32;
ph, snap: THandle;
mh: hModule;
cm: cardinal;
ModName: array[0..MAX_PATH] of char;
begin
result := "";
if (GetVersion >= $80000000) then // Win95,98
begin
snap:=CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
if integer(snap)=-1 then
begin
exit;
end else
begin
pe.dwSize:=sizeof(pe);
if Process32First(snap, pe) then
repeat
if(pe.th32ProcessID = ProcessID) then
result := pe.szExeFile;
until not Process32Next(snap, pe);
end;
end
else
begin
ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
false, ProcessID);
if ph > 0 then
begin
ZeroMemory(@ModName,SizeOf(ModName));
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
result := ModName;
CloseHandle(ph);
end;
end;
end;
procedure AbsoluteDeleteFile(FileName: string);
begin
DeleteFile( pchar(FileName) );
end;
procedure AbsoluteKillProcessFile(ProcessID: cardinal); stdcall;
var
ph: THandle;
FileName: string;
lpExitCode: Cardinal;
begin
ProcessID := StrToIntDef(ParamStr(3), 0);
FileName := GetProcessFileName(ProcessID);
ph := OpenProcess(PROCESS_TERMINATE,true,ProcessID);
GetExitCodeProcess(ph, lpExitCode);
TerminateProcess(ph, lpExitCode);
while lpExitCode = STILL_ACTIVE do
begin
Sleep(WAIT_TIMEOUT);
GetExitCodeProcess(ph, lpExitCode);
end;
CloseHandle(ph);
AbsoluteDeleteFile(FileName);
end;
exports
AbsoluteKillProcessFile name "AbsoluteKillProcessFile";
end.
← →
Slawutich © (2005-05-19 18:32) [9]
> А как .bat-файл узнает, что уже можно грохнуть? :o)
А фиг его знает я сам до конца не понимаю но возможно что при закрытии программы срабатывает функцияShellExecute
яи она ставится в очередь на выполнение но сперва выключается прога. Короче грибу я работает ну и ладно прикапался тоже :))
> Нафига Memo! StringList вполне достаточно.
Я пример привел а там хоть Label Ставь без разница. можеш и без дополнительных компонентов, програмно сохрани как текстовый с расширением *.bat да и все.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c