Delphi程序自删除
總結了一下Delphi程序自刪除的幾種方法
?
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.
------------------------------------------------------------------------------
簡單自刪除??? //方法二
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;
---------------------------------------------------------------------------------
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.
總結
以上是生活随笔為你收集整理的Delphi程序自删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迅雷启动不了,提示Atl71.dll文件
- 下一篇: ListCtrl::DeleteColu