Форум: "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