Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.212.121] |
|
Сообщ.
#1
,
|
|
|
Очередная функция, с помощью которой exe'шник удаляет сам себя.
uses Windows, 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(1); end; PS: для NT 4.0 и выше Автор: Krid |
Сообщ.
#2
,
|
|
|
Цитата Krid @ SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); не стоит так делать, к краху системы может привести.. |
Сообщ.
#3
,
|
|
|
Все нормально отработает...
|