我的学习生涯(Delphi篇) - 04

来源:互联网 发布:邝盛 知乎 编辑:程序博客网 时间:2024/04/30 07:38

    编程是一件有乐趣的工作!

    比如,我们可以实现各种异想天开的东西。

    下面的例子,就是可执行程序的自我删除。

    -------------------------------------------------------------------------------------------------美丽分割线---------------------------

   年代:2005

   文件:my0629.7z


    效果如下图:

    


    Unit1.pas

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    Button3: TButton;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure Button3Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;type  TRegKeyInfo = record  NumSubKeys: Integer;  MaxSubKeyLen: Integer;  NumValues: Integer;  MaxValueLen: Integer;  MaxDataLen: Integer;  FileTime: TFileTime;end;var  Form1: TForm1;  IHand:integer;  IKey:Hkey;  Regs: TRegKeyInfo;implementationuses  shlobj,activex,comobj;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var  sl:ishelllink;  pf:ipersistFile;  lnkName:Widestring;  app:string;begin  olecheck(cocreateInstance(clsid_shellLink,nil,Clsctx_inproc_server,iShellLink,sl));  pf:=sl as IPersistFile;  app:=application.exename;  OleCheck(sl.SetPath(pchar(app)));//建立有效的链接  LnkName:='C:\WINDOWS\Start Menu\Programs\redbird.lnk'; //设置目标文件  pf.Save(PWideChar(lnkName),true); //保存文件end;procedure TForm1.Button2Click(Sender: TObject);begin  RegCreateKeyEx(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp', 0, nil,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, IKey, @IHand);     RegSetValueEx(Ikey, 'DisplayName', 0, REG_SZ, Pchar('删除我吧!'),10); //字符长度  RegSetValueEx(Ikey, 'UninstallString',0, REG_SZ, pchar(ParamStr(0)+' /UNINSTALL'),4); end;procedure TForm1.Button3Click(Sender: TObject);var  f:textfile ;//作者不建议您将删除代码放在FormCreate事件中,作者认为那将出现不能删除的可能性。begin  AssignFile(f,'temp.bat');  Rewrite(F);  Writeln(f,'del '+paramstr(0));  Writeln(f,'del temp.bat');  closefile(f);  application.Terminate ;  winexec('temp.bat',SW_HIDE);  halt;  //对文本文件的处理比较简单,几经摸索,作者又找到了更好的第二种方法,简单易行,直接调用命令shell即可完成删除工作:  //application.Terminate;  //winexec(pchar('command.com /c del '+ParamStr(0)),SW_MINIMIZE);//最小化执行删除操作,否则将看到DOS窗口的瞬间闪烁  //halt; end;end.


原创粉丝点击