一个可执行的文件怎么删掉它自己(0分)

  • 主题发起人 主题发起人 webnetmax
  • 开始时间 开始时间
W

webnetmax

Unregistered / Unconfirmed
GUEST, unregistred user!
一个可执行的文件怎么删掉它自己,给我源代码好吗?
谢谢啦!
 
听课来了
 
在陈锦涛大哥网上找到的东东,或许能达到你的要求。
unit Unit1;

; ; ; interface

; ; ; uses
; ; ; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; ; ; StdCtrls;
; ; ; type
; ; ; TForm1 = class(TForm)
; ; ; Button1: TButton;
; ; ; procedure My_DeleteMe; //自定义程序自杀过程
; ; ; procedure Button1Click(Sender: TObject);
; ; ; private
; ; ; { Private declarations }
; ; ; public
; ; ; { Public declarations }
; ; ; end;

; ; ; var
; ; ; Form1: TForm1;

; ; ; implementation

; ; ; {$R *.DFM}

; ; ; procedure TForm1.Button1Click(Sender: TObject);
; ; ; begin
; ; ; My_DeleteMe;
; ; ; end;
; ; ; procedure TForm1.My_DeleteMe; //程序自杀
; ; ; //-----------------------------------------------------------
; ; ; function GetShortName(sLongName: string): string; //转换长文件名
; ; ; var
; ; ; sShortName: string;
; ; ; nShortNameLen: integer;
; ; ; begin
; ; ; SetLength(sShortName, MAX_PATH);
; ; ; nShortNameLen := GetShortPathName(PChar(sLongName),
; ; ; PChar(sShortName), MAX_PATH - 1);
; ; ; if (0 = nShortNameLen) then
; ; ; begin
; ; ; // handle errors...
; ; ; end;
; ; ; SetLength(sShortName, nShortNameLen);
; ; ; Result := sShortName;
; ; ; end;
; ; ; //-------------------------------------------------
; ; ; var
; ; ; BatchFile: TextFile;
; ; ; BatchFileName: string;
; ; ; ProcessInfo: TProcessInformation;
; ; ; StartUpInfo: TStartupInfo;
; ; ; begin
; ; ; BatchFileName := ExtractFilePath(ParamStr(0)) + '$$a$$.bat';
; ; ; AssignFile(BatchFile, BatchFileName);
; ; ; Rewrite(BatchFile);
; ; ; Writeln(BatchFile, ':try');
; ; ; Writeln(BatchFile, 'del "' + GetShortName(ParamStr(0)) + '"');
; ; ; Writeln(BatchFile, 'if exist "' + GetShortName(ParamStr(0)) + '"' + ' goto try');
; ; ; Writeln(BatchFile, 'del %0');
; ; ; Writeln(BatchFile, 'cls');
; ; ; Writeln(BatchFile, 'exit');
; ; ; CloseFile(BatchFile);
; ; ; FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
; ; ; StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
; ; ; StartUpInfo.wShowWindow := SW_Hide;
; ; ; if CreateProcess(nil, PChar(BatchFileName), nil, nil,
; ; ; False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
; ; ; ProcessInfo) then
; ; ; begin
; ; ; CloseHandle(ProcessInfo.hThread);
; ; ; CloseHandle(ProcessInfo.hProcess);
; ; ; end;
; ; ; Application.Terminate;
; ; ; end;
; ; ; end.
 
哟,这可是一个曾经很热门的问题。
好像中有个老外用一个很绝的办法,
大体是在运行中建立一个复制进程,
然后结束自身运行,再通过复制进程删除执行文件,
用到很多关于系统底层的东东,很是有点复杂。
不要问我具体细节,因为当时我只是看了看那篇文章,
即没保存也没测试。
简单的方法大概就是通过BAT之类的了。
 
接受答案了.
 
后退
顶部