![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как удалить exe Файл после завершения его работы? [D7]
Manfred8 © (2005-05-10 14:38:00)Нашел вот процедурку MoveFileEx(PChar(FilePath), nil,
MOVEFILE_DELAY_UNTIL_REBOOT);
но этого не достаточно,хочется чтобы изчезал сразу после выполнения,а не после перезагрузки системы..
Slawutich (2005-05-19 18:32:00) [1]
> А как .bat-файл узнает, что уже можно грохнуть? :o)
А фиг его знает я сам до конца не понимаю но возможно что при закрытии программы срабатывает функцияShellExecute
яи она ставится в очередь на выполнение но сперва выключается прога. Короче грибу я работает ну и ладно прикапался тоже :))
> Нафига Memo! StringList вполне достаточно.
Я пример привел а там хоть Label Ставь без разница. можеш и без дополнительных компонентов, програмно сохрани как текстовый с расширением *.bat да и все.
Style (2005-05-12 15:03:00) [2]//типа того
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.
Amoeba (2005-05-12 14:19:00) [3]
> Вот на мой взгляд самый короткий и реальный способ:
> на форму поставь Memo и напиши в нем
> del Myprogram.exe
> del Hana.bat
> делаеш Мемо Visible:=false чтоб не мешала.
Нафига Memo! StringList вполне достаточно.
Virgo_Style (2005-05-12 14:02:00) [4]Slawutich © (12.05.05 13:52) [5]
А как .bat-файл узнает, что уже можно грохнуть? :o)
Slawutich (2005-05-12 13:52:00) [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 файл грохнит сперва прогу а потом уже и себя самого.
И не нужны заумные здаровые скрипты "Краткость сестра таланта".
Marser (2005-05-10 16:47:00) [6]Мне понравился вариант с Королевства Delphi - перед завершением работы приложения с помощью rundll32 загружается DLL, которая по завершении приложения удаляет его файл, а затем выгружается.
А уж DLL можно удалить классически - через BAT, win.ini или ключа RunOnce реестра.
Viktop (2005-05-10 15:09:00) [7]
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.
GreatMaster (2005-05-10 15:01:00) [8]ГОРАЗДО надёжней к Batch-способу добавить чтобы в этот файл перед его удалением чёто записалось.... случайное такое :)
Manfred8 (2005-05-10 14:49:00) [9]ПРоблема решена,поиск рулит неимоверно :)
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