
- 加为好友
- 发送私信
- 在线聊天
|
| 发表于:2007-12-19 20:40:4810楼 得分:2 |
Top 3 楼Rainsea(飞龙在天)回复于 2002-08-22 18:29:32 得分 100 运行后,才被自身删除吧!? 要不程序怎么正确启动呢? 我的做法: 用过DOS的朋友应该还记得批处理文件吧,新建一个批处理文件a.bat,编辑其内容为:del %0,然后运行它,怎么样?a.bat把自己删除掉了!!!好,我们就用它来进行程序的“自杀”! 找一个EXE可执行文件,比如说abc.exe,新建一个批处理文件a.bat,编辑其内容为: :pp del abc.exe if exist abc.exe goto pp del %0 先运行abc.exe,再运行a.bat,然后将abc.exe退出,你会发现a.exe和a.bat都没有了!!!按照这个思路,我们可以在程序中根据文件名称写一个批处理,将上面的abc.exe换成自己的EXE文件名就可以了。运行Delphi,新建一个工程,添加一个Button到窗体上,点击 Button,写下如下代码: procedure TForm1.Button1Click(Sender: TObject); var Selfname,BatFilename,s1,s2:string; BatchFile: TextFile; begin Selfname:=Extractfilename(application.exename);//取EXE文件自己的名称 BatFilename:=ExtractFilePath(Application.ExeName)+ 'a.bat';//批处理文件名称 S1:='@del '+Selfname; S2:='if exist '+Selfname+' goto pp'; assignfile(BatchFile,BatFilename); rewrite(BatchFile); writeln(BatchFile,':pp'); writeln(BatchFile,S1); writeln(BatchFile,S2); writeln(BatchFile,'@del %0'); closefile(BatchFile); winexec(pchar(BatFilename),sw_hide);//隐藏窗口运行a.bat application.Terminate;//退出程序 end; 那我们的事情是不是就完了?NO!上面的程序原理是对的,但如果你的程序是运行在系统目录下如Windows目录下或者Windows\System等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。这可能是因为Windows对系统目录有保护功能,那怎么办?别急,我们请出一个函数CreateProcess,它的原型为: BOOL CreateProcess( LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes BOOL bInheritHandles, // handle inheritance flag DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION ); 这个函数和OpenProcess、ReadProcessMemory、WriteProcessMemory使用可以用来读取和修改内存数据,常用的游戏修改器就是用它。由于这些不是本文的重点所以这里不作详细介绍,感兴趣的读者可自行翻阅Delphi自带的帮助文件。用CreateProcess函数创建一个进程就可以完美的完成我们的“程序自杀”了。 运行Delphi,新建一个工程,添加一个Button到窗体上,全部代码如下: 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; //程序自杀 var BatchFile: TextFile; BatchFileName: string; ProcessInfo: TProcessInformation; StartUpInfo: TStartupInfo; begin {By Lovejingtao.http://Lovejingtao.126.com,Lovejingtao@21cn.com} BatchFileName := ExtractFilePath(ParamStr(0)) + '$$a.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 "' + BatchFileName + '"'); Writeln(BatchFile, 'cls'); 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. http://topic.csdn.net/t/20020822/18/962406.html | | |
修改
删除
举报
引用
回复
| |