总结了一下Delphi程序自删除的几种方法
//方法一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
program Project1; uses Windows; function WinExec(lpCmdline: PAnsiChar; uCmdShow: LongWord): LongWord; stdcall; external 'kernel32.dll' name 'WinExec'; function ExtractFilePath(FileName: string): string; begin Result := ''; while ((Pos('/', FileName) <> 0) or (Pos('/', FileName) <> 0)) do begin Result := Result + Copy(FileName, 1, 1); Delete(FileName, 1, 1); end; end; procedure DeleteMe; var BatchFile: TextFile; BatchFileName: string; begin BatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat'; AssignFile(BatchFile, BatchFileName); Rewrite(BatchFile); Writeln(BatchFile, ':try'); Writeln(BatchFile, 'del "' + ParamStr(0) + '"'); Writeln(BatchFile, 'if exist "' + ParamStr(0) + '"' + ' goto try'); Writeln(BatchFile, 'del %0'); CloseFile(BatchFile); end; begin DeleteMe ; WinExec('_deleteme.bat',SW_HIDE); end. |
方法二
1 2 3 4 5 6 7 8 9 10 11 12 |
var f:textfile; self:string; begin self:=paramstr(0); assignfile(f,'delself.bat'); rewrite(f); writeln(f,'del '+pchar('"'+pchar(self)+'"')); writeln(f,'del %0'); closefile(f); WinExec('delself.bat',sw_hide); end; |
方法三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
program Project2; uses Windows, ShellAPI, ShlObj, SysUtils2; function Suicide: Boolean; var sei: TSHELLEXECUTEINFO; szModule: PChar; szComspec: PChar; szParams: PChar; begin szModule := AllocMem(MAX_PATH); szComspec := AllocMem(MAX_PATH); szParams := AllocMem(MAX_PATH); // get file path names: if ((GetModuleFileName(0,szModule,MAX_PATH)<>0) and (GetShortPathName(szModule,szModule,MAX_PATH)<>0) and (GetEnvironmentVariable('COMSPEC',szComspec,MAX_PATH)<>0)) then begin // set command shell parameters lstrcpy(szParams,'/c del '); lstrcat(szParams, szModule); // set struct members sei.cbSize := sizeof(sei); sei.Wnd := 0; sei.lpVerb := 'Open'; sei.lpFile := szComspec; sei.lpParameters := szParams; sei.lpDirectory := 0; sei.nShow := SW_HIDE; sei.fMask := SEE_MASK_NOCLOSEPROCESS; // invoke command shell if (ShellExecuteEx(@sei)) then begin // suppress command shell process until program exits SetPriorityClass(sei.hProcess,HIGH_PRIORITY_CLASS);//IDLE_PRIORITY_CLASS); SetPriorityClass( GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); // notify explorer shell of deletion SHChangeNotify(SHCNE_Delete,SHCNF_PATH,szModule,nil); Result := True; end else Result := False; end else Result := False; end; begin Suicide; end. |
转载请注明:exchen's blog » Delphi 程序自删除