汉花唐落 发表于 2014-8-7 09:10:47

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.

耕望平所 发表于 2019-7-13 12:51:41

厉害!强~~~~没的说了!











static/image/common/sigline.gif
房产资讯新闻信息
房地产资讯新闻信息
房价资讯新闻信息
页: [1]
查看完整版本: Delphi程序自删除