Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
1-92517
ev
2002-10-17 20:43
2002.10.28
как сделать TStringGrid и TListBox со скролом справа?


14-92664
Jumbot
2002-10-05 20:31
2002.10.28
Очень большая просьба


7-92764
arcoant
2002-08-23 16:34
2002.10.28
Помогите please узнать открыта ли дверца CDROM a


1-92478
User0
2002-10-16 13:05
2002.10.28
Траблы с WORD-ом!!! HELP ME!!!


14-92691
zzet
2002-10-07 18:16
2002.10.28
Пора начинать праздновать?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский