程序快捷方式/程序刪除項/EXE自刪除DIY

字號:

每一個編程愛好者,都希望自己的作品能為大家接受和喜愛,但我們的作品大多是簡單的一個EXE文件的拷貝,既不需安裝也沒有刪除程序,讓人覺得只是程序而不是產(chǎn)品,以下我以Delphi 為例和大家交流一下程序組快捷方式建立、添加刪除程序組中的刪除項和程序的自刪除等功能。
    1.以下先來介紹建立程序組快捷方式的方法:
    在uses 單元中加入 shlobj,activex,comobj,在窗口中添加一個button,并在其事件中添加以下代碼:
    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;
    當然以上這段代碼應放在程序第一次運行時的代碼段中,而且程序組或是桌面的位置要以注冊表 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders中的對應值為準。您對注冊表的操作可通過Delphi對注冊表封裝了的TReGIStry 來完成,此法比較簡單,在此就不再贅述,如您想寫出更小的程序或是您在用VB編程,那就得調(diào)用API.以下作者將以對注冊表API函數(shù)的直接調(diào)用向大家介紹如何建立添加刪除程序中的項目.同樣,這段代碼也應放在程序首次運行時執(zhí)行。
    program project1;
    uses
    Windows;
    {$R *.RES}
    type
    TRegKeyInfo = record
    NumSubKeys: Integer;
    MaxSubKeyLen: Integer;
    NumValues: Integer;
    MaxValueLen: Integer;
    MaxDataLen: Integer;
    FileTime: TFileTime;
    end;
    var IHand:integer;
    IKey:Hkey;
    Regs: TRegKeyInfo;
    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'),//刪除所調(diào)用的命令行
    4);
    end.
    此段代碼將 你的程序全路徑名和"/UNINSTALL"參數(shù)寫入了注冊表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp中,你在添加刪除程序中可以看到“刪除我吧!”的項目,而當你點擊此項目時,你的程序通過ParamStr(1)將收到"/UNINSTALL"的參數(shù),并以此為標識調(diào)用刪除程序的代碼即可。以下我們再來介紹當你的程序收到此參數(shù)后,不需調(diào)用其它程序而“自刪除”的兩個方法。
    其中之一是在接到此參數(shù)后動態(tài)建立一個刪除文件的批處理文件,在程序內(nèi)部將安裝程序后生成的諸如快捷方式等文件和注冊表值刪除后在退出前調(diào)用此批處理文件將自己刪除即可,如:
    procedure TForm1.FormCreate(Sender: TObject);
    var f:textfile ;//作者不建議您將刪除代碼放在FormCreate事件中,作者認為那將出現(xiàn)不能刪除的可能性。
    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;
    end;
    對文本文件的處理比較簡單,幾經(jīng)摸索,作者又找到了更好的第二種方法,簡單易行,直接調(diào)用命令shell即可完成刪除工作:
    application.Terminate;
    winexec(pchar('command.com /c del '+ParamStr(0)),SW_MINIMIZE);//最小化執(zhí)行刪除操作,否則將看到DOS窗口的瞬間閃爍
    halt;
    好了,有了以上的三點裝飾,您的程序應該已經(jīng)像個產(chǎn)品的樣子,至于程序的內(nèi)容,還得您來充實了。