Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

Как удалить 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
4-1113414663
Flutter
2005-04-13 21:51
2005.06.06
Windows shell


1-1116516110
Тестер
2005-05-19 19:21
2005.06.06
Отладка сервисов в Delphi?


3-1114095844
malamba
2005-04-21 19:04
2005.06.06
Не подключается к базе на Windows 98


1-1116573017
<Lelik>
2005-05-20 11:10
2005.06.06
Вопрос про идентификаторы


14-1116337121
reticon
2005-05-17 17:38
2005.06.06
Знатокам HTML. Гиперссылка без href.