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

Вниз

DeleteFile   Найти похожие ветки 

 
_sMile   (2002-09-07 07:55) [0]

Как сделать так, чтобы мой запущенный файл удалил сам себя?


 
Viktor Kushnir ©   (2002-09-07 08:28) [1]

О этот извечный вопрос....

Создай своей прогой .bat файл, который будет ждать, пока твоя прога не завершит работу, затем он пусть прогу удалит, а затем и себя.
А можно не бат написать, а другую прогу в тех же дельфях (~20-30 кб получится) невидемую и не заметную, поместить её в дебри временных папок и дать задание удалить прогу основную...


 
Endre ©   (2002-09-08 11:06) [2]

Короче:
procedure CreateBatFile;
var
f:file of text;
begin
Assign(f,"del.bat");
rewrite(f);
WriteLn(f,"del "+paramstr(0));
WriteLn(f,"del del.bat");
end;

procedure TForm1.FormCloseQuery(Sender: TObject, var CanClose:boolean);
begin
CreateBatFile;
WinExec("del.bat",0);
application.terminate;
end;
Твоя прога успеет закрыться до того, как вызовется бат-файл.
З.Ы.: На сайте есть статья по работе с ДЛЛ-ками, там это описано.


 
Almaz ©   (2002-09-09 02:08) [3]


> Endre © (08.09.02 11:06)
> Твоя прога успеет закрыться до того, как вызовется бат-файл.

Не факт. На моей машине не успевает. Поэтому рекомендую вам написать так:

procedure SelfDestroy;
var
F: TextFile;
begin
ChDir(ExtractFilePath(ParamStr(0)));
AssignFile(F, "selfdel.bat");
Rewrite(F);
WriteLn(F, ":try");
WriteLn(F, "@del "", ExtractFileName(ParamStr(0)), """);
WriteLn(F, "@if exist "", ExtractFileName(ParamStr(0)), "" goto try");
WriteLn(F, "@del selfdel.bat");
CloseFile(F);
WinExec("selfdel.bat", SW_HIDE);
Application.Terminate;
end;


Удачи.


 
Song ©   (2002-09-09 08:22) [4]

Вообще решая такую задачу, просто помещают тот же батник на удаление в ключ RunOnce реестра и файл будет удалён на следующей перезагрузке.


 
_sMile   (2002-09-09 15:58) [5]

2 Almaz: А мне не надо, чтобы программа завершалась до её удаления, а надо чтобы именно этим действием она завершалась. Самоуничтожение типа :)
2 Song: Если так сделаешь, то покажется окно ДОС-сессии, а этого мне совсем не надо. Пользователь ещё забеспокоится, что, мол, его винду потихоньку удаляют =)

В общем сделал я всё, всем большое спасибо, особенно Viktoru Kushniru, который первый подал идею про батник.




 
Alx2 ©   (2002-09-09 16:14) [6]

>_sMile (09.09.02 15:58)
>мне не надо, чтобы программа завершалась до её удаления, а надо
>чтобы именно этим действием она завершалась. Самоуничтожение
>типа :)
Не получится. В это время exe-файл используется операционкой (спроецирован в память) и она же не даст его удалить.


 
Song ©   (2002-09-09 23:10) [7]

Сделать чтобы окно ДОС сессии не появилось - не сложно. Есть такая утилита start.exe в составе виндов, вот это она и делает :)


 
_sMile   (2002-09-12 19:50) [8]

2 Song Каким образом эту start.exe использовать?


 
MadBurro ©   (2002-09-12 22:30) [9]

Зафиг вам страдать? :))
Вот отличный код:

program delself;

uses
windows;

procedure DeleteSelf;
var hModule:THandle;
szModuleName:array[0..MAX_PATH] of char;
hKrnl32 : THandle;
pExitProcess, pDeleteFile, pFreeLibrary,pUnmapViewOfFile : pointer;
ExitCode:UINT;
begin
hModule:= GetModuleHandle(nil);

GetModuleFileName(hModule, szModuleName, sizeof(szModuleName));


hKrnl32 := GetModuleHandle ( "kernel32" );
pExitProcess := GetProcAddress ( hKrnl32, "ExitProcess" );
pDeleteFile := GetProcAddress ( hKrnl32, "DeleteFileA" );
pFreeLibrary := GetProcAddress ( hKrnl32, "FreeLibrary" );
pUnmapViewOfFile := GetProcAddress ( hKrnl32, "UnmapViewOfFile" );

ExitCode := system.ExitCode;

if($80000000 and GetVersion())<>0 then
// Win95, 98, Me
asm

lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pDeleteFile
push pFreeLibrary
ret
end
else
begin
CloseHandle(THANDLE(4));

asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pDeleteFile
push pUnmapViewOfFile
ret
end
end
end;

begin
DeleteSelf;
end.


 
Игорь Шевченко ©   (2002-09-13 09:33) [10]

MadBurro © (12.09.02 22:30)

Бред :-)

Хоть бы со стеком разобрались и посмотрели, какие аргументы будут
функциям передаваться.


 
paul_shmakov ©   (2002-09-13 14:35) [11]

2 Игорь Шевченко:
ничего бредового! и со стеком все в порядке - посмотрите внимательно (по крайней мере в части winnt).
этот пример мы с Digitman ну очень подробно рассматривали примерно полгода назад, разобрали и объяснили, почему он работает и как.

win9x версию мы не трогали, а nt основана на том факте, что под nt (именно nt, но не w2k, xp) хэндл со значением 4 - это всегда хэндл проекции файла процесса. т.е. его закрываем, и pe модуль нашего процесса выгружается - соответственно, файл можно удалять.

а код на ассемблере тут нужен по той причине, что после закрытия проекции, мы больше не можем обращаться к тому адресному пространству, в котором лежал наш код и данные.
тогда по идее сразу после вызова UnmapViewOfFile должен быть access violation - как же быть? а просто - воспользуемся тем фактом, что у потока есть стек, который уничтожается при завершении потока. т.е. со стеком после UnmapViewOfFile ничего не случится - поэтому "пихаем" все, что понадобится в стек.

а то, что вас смутило в стеке, в прошлый раз смутило Digitman-а :) (если я ошибаюсь - память плохая - прошу прощения ;)
этот код:

CloseHandle(THANDLE(4));
asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pDeleteFile
push pUnmapViewOfFile
ret
end;

генерирует следующую последовательность вызовов:

CloseHandle(4);
UnmapViewOfFile(hModule);
DeleteFile(szModuleName);
ExitProcess(0);



 
Игорь Шевченко ©   (2002-09-13 15:06) [12]

MadBurro © (12.09.02 22:30)
paul_shmakov © (13.09.02 14:35)

Приношу свои извинения. В части WinNt оно действительно работает.


 
paul_shmakov ©   (2002-09-13 15:39) [13]

btw, под w2k этот код тоже работает, хотя в списке хэндлов информации о хэндле 4 нет. тем не менее CloseHandle(4) выполняется без ошибок.


 
paul_shmakov ©   (2002-09-13 15:47) [14]

2 _sMile:
хочу предупредить - используйте этот код (MadBurro © (12.09.02 22:30)) на свой страх и риск, так как полагается он на недокументированные особенности. да и вообще - достаточно опасен.
лучше использовать легальные способы, пусть они и не так красивы.



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

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

Наверх




Память: 0.5 MB
Время: 0.022 c
7-92762
Metallica
2002-08-21 13:17
2002.10.28
->>> Как сделать активным процесс, зная его хэндл.


14-92646
incognito2
2002-10-06 20:02
2002.10.28
Очень надо!!! Придумайте хоть алгоритм.


6-92629
MVova
2002-08-27 15:46
2002.10.28
Где узнать какин порты какими програмами используються?


14-92720
lak_b
2002-10-08 15:25
2002.10.28
оффтопик


1-92533
Behemoth
2002-10-16 09:24
2002.10.28
Как передать фокус нужному элементу на TabSheet?