zoukankan      html  css  js  c++  java
  • 程序怎么才能把自己的删除掉?

    可以写一个BAT文件
    例如:a.bat
         del %0
    这样就把a.bat删除掉了!
    放一个例子:
    用过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等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。那怎么办?别急,我们请出一个函数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; //程序自杀
    //-----------------------------------------------------------
    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.

  • 相关阅读:
    C++中的向量学习
    delphi中判断popupmenu的弹出来源....
    在QT4中使用类似QVBox类似功能
    flex控件的学习网站(收藏)
    总结Flash XMLSocket 通信问题
    Fiddle扩展HttpPing批量检测web服务器是否正常
    flex的Socket通讯沙箱和安全策略问题
    .Net平台开源作业调度框架Quartz.Net
    IE6 7 select option设置disabled无效
    Flex值得一看参考资源
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/337318.html
Copyright © 2011-2022 走看看