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

Вниз

Самоудаление программы по нажатию на кнопку...   Найти похожие ветки 

 
Max.66RUS   (2008-01-02 13:05) [0]

Добрый день. Задача такая- в приложении есть кнопка на форме, по нажатию на которую, программа должна самоудалиться - пробовал использовать для этого процедуру с .bat файлом - почему-то не работает, хотя в приложениях без формы данная процедура работает на ура... Подскажите как переделать данный код чтобы он заработал в приложениях с формами. Вот код:

Procedure DELETE_APPLICATION;
Function GetTmpDir: String;
Var
PC: PChar;
Begin
PC:=StrAlloc(MAX_PATH+1);
GetTempPath(MAX_PATH, PC);
Result:=String(PC);
StrDispose(PC);
End;
Function GetTmpFileName(ext: String): String;
Var
PC: PChar;
Begin
PC:=StrAlloc(MAX_PATH+1);
GetTempFileName(PChar(GetTmpDir), "uis", 0, PC);
Result:=String(PC);
Result:=ChangeFileExt(Result, ext);
StrDispose(PC);
End;
Var
BAT_FILE: TStringList;
BAT_FILE_NAME: String;
Begin
BAT_FILE_NAME:=GetTmpFileName(".bat");
FileSetAttr(ParamStr(0), 0);
BAT_FILE:=TStringList.Create;
With BAT_FILE do
Begin
Try
Add(":Label1");
Add("del ""+ParamStr(0)+""");
Add("if Exist ""+ParamStr(0)+"" goto Label1");
Add("rmdir ""+ExtractFilePath(ParamStr(0))+""");
Add("del "+BAT_FILE_NAME);
SaveToFile(BAT_FILE_NAME);
ChDir(GetTmpDir);
WinExec(PChar(BAT_FILE_NAME), SW_HIDE);
Finally
BAT_FILE.Free;
End;
Halt;
End;
End;


Заранее спасибо за ответ...


 
Riply ©   (2008-01-02 13:30) [1]

> [0] Max.66RUS   (02.01.08 13:05)
пыталасьнонесумелапрочитатькод :)


 
Sergey Masloff   (2008-01-02 13:30) [2]

Цель такого действия? Вариантов решения - много, зависит от того для чего это нужно.


 
Сергей М. ©   (2008-01-02 13:39) [3]


>  программа должна самоудалиться - пробовал использовать
> для этого процедуру с .bat файлом


Это не "самоудаление".


 
Max.66RUS   (2008-01-02 14:39) [4]

Да понятно, что это не "самоудаление" - но нужно чтобы исполняемый файл программы удалился по нажатию кнопки в этой программе - а каким способом - с .bat файлом или без - значения не имеет - если у кого есть подобный код - выложите его пожалуйста...


 
MetalFan ©   (2008-01-02 15:09) [5]

стандартными средствами запущенный исполняемый файл удалить нельзя


 
Bora_ru   (2008-01-02 16:30) [6]

сделай программу №2, задача которой завершить программу№1 и удалить ее с диска. Программу №2 заранее включи в №1 как ресурс. При нажатии кнопки, распаковывай №2 в windows\temp и запускай ее...


 
{RASkov} ©   (2008-01-02 17:05) [7]

const BatFlNm = "delapp.bat";
var F: TextFile; FullBatFlNm: String;
begin
 FullBatFlNm:=ExtractFilePath(Application.ExeName)+BatFlNm;
 AssignFile(F, FullBatFlNm);
 Rewrite(F);
 WriteLn(F, ":Start");
 WriteLn(F, "del ""+Application.ExeName+""");
 WriteLn(F, "if exist ""+Application.ExeName+"" goto Start");
 WriteLn(F, "del ""+FullBatFlNm+""");
 CloseFile(F);
 WinExec(PChar(FullBatFlNm), SW_HIDE);
 Close;
end;


 
Виктор007   (2008-01-02 19:13) [8]

Вот код валялся у меня, не пробовал сам.
procedure OriginalChanger;
var szPathOrig, szPathClone: array [0..MAX_PATH] of char;
   szCmdLine: array [0..512] of char;
   hFile,hProcessOrig :THandle;
   si :TSTARTUPINFO;
   pi :TProcessInformation;
begin
     GetModuleFileName(Nil, szPathOrig, MAX_PATH);
     GetTempPath(MAX_PATH, szPathClone);
     GetTempFileName(szPathClone, PChar("Del"), 0, szPathClone);
     CopyFile(szPathOrig, szPathClone, FALSE);
     hfile := CreateFile(szPathClone, 0, FILE_SHARE_READ,
                         NIL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NIL);
     hProcessOrig := OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId);
     StrCopy(szCmdLine, PChar(Format("-CLONE %s %d "%s"",[szPathClone, hProcessOrig, szPathOrig])));
     ZeroMemory(@si, sizeof(si));
     si.cb := sizeof(si);
     CreateProcess(NIL, szCmdLine, NIL, NIL, TRUE, 0, NIL, NIL, si, pi);
     CloseHandle(hProcessOrig);
     CloseHandle(hfile);
end;

procedure CloneChanger(hProcessOrig :THandle; PathOrig:string);
begin
     WaitForSingleObject(hProcessOrig, INFINITE);
     CloseHandle(hProcessOrig);
     DeleteFile(PathOrig);
end;

begin
 if ParamStr(1) <>"-CLONE" then
 begin
   OriginalChanger;
   Exit;
 end
 else
   CloneChanger(StrToInt(ParamStr(2), StrToInt(ParamStr(3));
 Application.Init;
 ...
end.


 
Max.66RUS   (2008-01-03 15:41) [9]

В данный момент реализовал пока только один рабочий способ - сделал ещё одну программу, которая завершает и удаляет мою - включил её как ресурс в свою программу - при нажатии на кнопку она распаковывается на диск - запускается - завершает мою и удаляет её с диска - способ геморойный(увеличился на 20 Кб размер, геморой с компиляцией RES файла, включение его в программу, распаковка исполняемого файла на диск и т.д.) - и самый главный косяк - хоть моя программа и удалилась - но кто удалит ту программу которая удалила мою? Крайне нежелательно, чтобы на диске оставались какие-либо остатки от моей программы...

Код предложенный {RASkov} почему-то не работает - не пойму почему - при нажатии на кнопку программа закрывается, содается .bat файл и всё...(

У кого ещё какие есть мысли - как удалить программе саму себя и желательно без лишнего гемороя...


 
{RASkov} ©   (2008-01-03 15:59) [10]

> [9] Max.66RUS   (03.01.08 15:41)
> Код предложенный {RASkov} почему-то не работает

Странно.... я у себя проверял - работает.

Вот где-то в инете "спер" этот код. Попробуй, я не пробывал:

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;


 
{RASkov} ©   (2008-01-03 16:11) [11]

> Попробуй, я не пробывал:

Проверил - вроде бы работает.... по крайней мере у меня сработало как нужно :)


 
easy ©   (2008-01-03 16:15) [12]

http://delphiworld.narod.ru/base/app_delete_itself.html
http://delphiworld.narod.ru/base/app_delete_itself2.html


 
Max.66RUS   (2008-01-03 16:16) [13]

{RASkov} - спасибо огромное! Последний код работает на ура! Проблема решена.



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
15-1198397361
Evanescence
2007-12-23 11:09
2008.01.27
Помогите выбрать сервер для сайта


2-1198847106
paul
2007-12-28 16:05
2008.01.27
FindKey


2-1199041662
DmT
2007-12-30 22:07
2008.01.27
использование стандартного ввода/вывода для конс. приложений


15-1198054272
Oyeme
2007-12-19 11:51
2008.01.27
проверка повторных цыфр и лаба


2-1199083426
Mister
2007-12-31 09:43
2008.01.27
подключения ресурсного файла