Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.011 c
1-1116516110
Тестер
2005-05-19 19:21
2005.06.06
Отладка сервисов в Delphi?


1-1116423492
NeyroSpace
2005-05-18 17:38
2005.06.06
TTVirtualStringTree: как сделать свой [+] для раскрытия/закрытия?


1-1116498890
MegaVolt
2005-05-19 14:34
2005.06.06
Перетаскивание с моей проги в чужое приложение.


3-1114501326
slaga
2005-04-26 11:42
2005.06.06
OracleDirectPathLoader, помогите разобраться ?


4-1113771014
totuin
2005-04-18 00:50
2005.06.06
Доступ в меню "Отправить"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский