安装与卸载之卸载篇——程序自杀

NSIS + QT 做安装卸载程序 NSIS + QT 做安装卸载程序。 NSIS仅仅用于把所有的东西封装为一个EXE。 NSIS打包 QT做有逼格的可视化界面,并且方便实现。 以下是nSIS源码: icon ".\xxx.ico" #设置图标 OutFile "setup.exe" #设置生成程序 SilentInstall silent #静默安装不出现任何NSIS自带界面 F 阅读详情
       电脑用得久了,安装的软件乱七八糟,怎么办?一般我们会打开控制面版里的添加删除程序选项,选择相应的卸载选项就可以了。但如果我们能在自己的程序中增加一个删除功能来实现“自杀”,则会令软件增色不少。
  有点电脑常识的人都知道,在Windows下如果程序正在运行,那么是无法将其删除的,当然,也不是绝对不可以。CIH大家应该知道吧,它的核心有两个,一个就是取得Ring0级权限,然后就可以随便干想干的事(比如说修改正在运行的文件),而我们一般的程序是运行在Ring3级上的。顺便提一句---NT下没有Ring的概念,所以CIH对其无效。用Delphi内镶汇编也可以取得Ring0级权限,但如果我们的程序运行在NT或者Win2000下就没有效果了。在说句题外话,现在的编译器都很不错了,大多数程序员都编不出比编译器编译出的更理想的代码,象Delphi,如果将它的某些单元代码改用内镶汇编,在某些方面如字符串处理方面会提高5倍左右的效率,但NT不支持某些汇编代码,如果程序在NT下工作就会出错,怎么办?稳定第一!所以我们不用这个方法,而且,用这个方法有点杀鸡用牛刀的味道。
  用过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.

补充:1、上面的批处理的 del %0等同于 del a.bat,用del a.bat则批处理文件必须为a.bat,用del %0则可以随意。
2、所有程序在Pwin98+Delphi5、Win2000+Delphi5下运行通过。
本文的标题为《安装与卸载之卸载篇》,下次将介绍如何用Delphi制作自己的安装程序。记得有一位著名的黑客说过:我从来不去找什么工具软件,需要的话就自己写一个。如果我们也持这种态度,则编程水平一定会越来越高。

程序安装与卸载故障排除指南 htmltable {th, td {th {pre {简介:在IT行业,处理程序安装和卸载中遇到的问题是常见任务。文章深入分析并提供了针对安装失败、程序无法卸载等情况的解决策略。这包括结束运行中的程序进程、检查系统兼容性、更新必备组件、重新下载损坏的安装文件、利用卸载工具和故障排除工具如”Microsoft Program Install and Uninstall Troubleshooter”,以及进行系统更新和维护。 阅读详情

相关推荐

陈经韬Delphi资料

陈经韬Delphi资料2000~2001

我理解的程序安装和卸载过程

我的个人理解:        其实桌面软件就是文件+注册表值。通过注册表的值索引到相应的文件,然后加载文件,实现程序运行。        安装的过程,就是把文件copy到对应的目录,然后写注册表值(添加索引)。        卸载的过程,就是把注册表值设置为无效或删掉,然后依次删掉文件系统的文件。 那么,程序出错,就是索引无法对应(比如找不到文件,索引值不对应等等)。这时候,暴力删除文

zhi_ai_yaya的专栏 947

HackBGRT:适用于UEFI系统的Windows启动徽标更改器

HackBGRT HackBGRT旨在用作基于UEFI的Windows系统的启动徽标更改器。 概括 在基于UEFI的计算机上引导时,Windows可能会在存储在UEFI固件中的“引导图形资源表(BGRT)”部分中显示供应商定义的徽标。 永久更改映像通常非常困难,但是在引导过程中可以使用自定义UEFI应用程序覆盖映像。 HackBGRT正是这样做的。 用法 重要提示:如果您弄乱了安装,则系统可能无法启动! 使用前,请创建应急磁盘。 该软件不提供任何保修。 使用风险自负。 确保您的计算机正在使用UEFI引导。 确保禁用安全启动,除非您知道如何对EFI应用程序进行签名。 Windows安装 从“发布”页面获取最新版本。 启动setup.exe并按照说明进行操作。 您可能需要手动禁用安全启动,然后重试。 安装程序将启动记事本以修改配置。 如果您只需要一个自定义图像,则默认为最佳。

安装与卸载之卸载篇---程序自杀

 安装与卸载之卸载篇---程序自杀                                                       陈经韬搜索关键字:程序自杀 自删除 强制删除      电脑用得久了,安装的软件乱七八糟,怎么办?一般我们会打开控制面版里的添加删除程序选项,选择相应的卸载选项就可以了。但如果我们能在自己的程序中增加一个删除功能来实现“自杀”,则会令软件增色不少。

ZLMSDN的专栏 1369

Vectorless dynamic动态功耗分析——Voltus

power 计算工具会根据设计信息和用户提供的activity和switching约束来生成虚拟的worst-case的power vector,难点在于哪些instances视为switching,在没有仿真的前提下如何确定开关的时间,使用timing文件(TWF)

qq_44347276的博客 2789

单机多环境部署apollo 2.3.0

理解apollo的整体架构后,对比nacos配置中心功能点,其设计的复杂度以及完整度相较nacos而言更为丰富 对于不同的环境,例如 FAT, PRO 在部署时进程已经完全物理隔离,并且每个环境config/adminservice依赖的数据也完全物理隔离(连接不同的db),在数据隔离与安全方面做的很完善,但同时也提升了架构的复杂度 而 portal 可以管理多个环境,单节点部署虽然有单点问题,但并不会影响业务从configservice读取配置, 挂掉只要重启就可以,只是在

Life is a starting point everywhere 1299

应用程序安装卸载原理

注:http://blog.youkuaiyun.com/tangcheng_ok/article/details/7657416 1、由于代码中用到了PackageInstallObserver,PackageInstallObserver在Eclipse中是不能调用的,必须在Linux环境下编译好系统后才能编译此应用程序。 2、Android4.0安装的api以及和2.3的不同,多了个参数。感兴趣的可

移动开发学习笔记 1894

告别Keil?在Mac上配置STM32CubeIDE + CMSIS-DAP调试器全攻略(含常见报错解决)

本文详细介绍了在Mac平台上配置STM32CubeIDE与CMSIS-DAP调试器的全流程,包括硬件准备、软件安装、工程创建及调试优化。通过实战指南,帮助开发者高效完成STM32开发,解决常见报错问题,提升开发效率。

weixin_30485379的博客 433

卸载应用程序的原理

卸载应用程序的原理涉及操作系统的管理、用户交互和文件系统的操作。通过用户的请求,操作系统会执行一系列步骤来安全地删除应用程序及其相关数据。理解这些原理有助于开发者在设计应用程序时考虑用户体验和系统资源管理。操作系统在管理应用程序时,涉及到多个方面,包括唯一标识符、生命周期管理、权限管理、资源管理、更新维护以及安全性等。通过这些机制,操作系统能够有效地管理设备上的应用程序,确保用户能够顺利地安装、使用和卸载应用程序。应用程序的安装结构包括可执行文件、资源文件、配置文件和数据文件等多个部分。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 2143

2019美亚杯团体赛刷题 部分题解(1-42、106-116)

文章目录写在前面使用工具刷题1.在黑客路由器里,有一台设备的MAC地址为00:11:6B:47:4D:55,请问它的IP地址是什么?2.在黑客路由器里,发现一设备的IP地址为192.168.0.103,请问该设备为如下哪一个:3.警方已经查证所有连接此router的设备都归黑客所有,根據黑客路由器的訊息,下列哪组(设备---ip)是错误的:4.Hacker现场检获的Windows主机硬盘已成功取证并制作成镜像Win1.E01,下列哪个是其硬盘证据文件的MD5哈希值。5.MD5hash算法会产生一个什么大小的

7ruth0hn的博客 7545

火车头采集器超级详细图文使用指导(面向新手)

火车采集器·超级详细使用指导

DE的个人原创笔记 1万+

用Delphi创建服务程序

作者: 陈经韬 Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:   (1)不用登陆进系统即可运行.   (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.   笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.   运行Delp

abin30的专栏 1308

aubo i5 + realsense D435i识别抓取实践二

aubo i5 + realsense D435i识别抓取实践二前言一、手眼标定是什么?二、标定软件安装1.aruco_ros安装2.vision_visp安装3.easy_handeye安装4.realsense驱动安装5.安装realsense ROS软件包三、配置1.launch文件修改2.打印二维码四、手眼标定1.启动launch文件2.标定步骤3.发布tf关系 前言 前面配置好了aubo机械臂的ROS软件包,机械臂可以正常运行后,接下来我们进行机械臂与相机的手眼标定。手眼标定分为eye_on_ha

转角 6373

银河麒麟桌面版系统下Qt程序打包、安装与卸载

文章主要描述银河麒麟桌面版操作系统下,Qt编写的程序,如何使用linuxdeployqt工具,提取所有依赖库文件,使用dpkg工具,打包成安装包,以及软件的安装与卸载。

weixin_42868530的博客 4254

【python数据挖掘课程】二十八.基于LDA和pyLDAvis的主题挖掘及可视化分析

这是《Python数据挖掘课程》系列文章,前面很多文章都讲解了数据挖掘、机器学习,这篇文章主要讲解LDA和pyLDAvis算法,同时讲解如何读取CSV文本内容进行主题挖掘及可视化展示。文章比较基础,希望对你有所帮助,提供些思路,也是自己教学的内容。推荐大家购买作者新书《Python网络数据爬取及分析从入门到精通(分析篇)》,如果文章中存在错误或不足之处,还请海涵。 目录: 一.显示结果及安装 二.LDA主题挖掘 三.pyLDAvis可视化分析 四.小结

杨秀璋的专栏 1万+

Arduino与Proteus仿真实例-HG7881(L9110)驱动直流电机仿真

HG7881(L9110)驱动直流电机仿真 HG7881 (L9110) 双通道电机驱动器模块。 HG7881 (L9110) 是一款紧凑型电机驱动芯片,支持 2.5-12V 电压范围,800mA 连续电流。 这些芯片具有内置输出钳位二极管以保护敏感的微控制器电子设备。 它们适用于非常小的机器人项目。 每个 HG7881 (L9110) 芯片都能够使用两个数字控制输入驱动单个直流电机。 一个输入用于选择电机方向,而另一个用于控制电机速度。 速度是通过使用 PWM 脉冲宽度调制来控制的。 电机驱动器通常具有

视觉与物联智能 3048

MySQL 卸载与安装

以Windows10操作系统为例: 一、 先看看如何卸载 1、首先,停止window的MySQL服务,【windows键+R 】打开运行框,输入【services.msc】打开(或者找到“控制面板”-> “管理工具”-> “服务”,停止MySQL后台服务)服务管理器,停止MySQL后台服务。 2、卸载MySQL安装程序。找到“控制面板”-> "程序...

Star's Tech Blog 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

程序的安装与卸载

开发安装包有很多种方法, 本文提供一种思路 程序的安装与卸载分两个部分 一个是安装 一个是卸载 安装程序 负责联网下载程序的压缩包,解压,创建快捷方式,检测与修复项目运行环境 ,写入注册表 ,生成卸载程序到项目目录,以及进入项目 卸载程序 负责 删除整个项目,删除自身,删除注册表,删除快捷方式, 大体就是这个思路,然后逐一实现出来就行了 其中注册表部分为了要在win10系...

董国政的博客 1433

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JDK的卸载与安装

jdk的卸载:主要包括检查JDK,程序卸载,伤处环境变量、残留文件夹、注册表中信息等五个部分,jdk的安装:主要包括安装文件的下载、二进制文件启动安装、环境变量的配置,JDK的检查等四部分。JDK安装的路径需要注意,此路径与环境变量配置相对应,注册表中的注册信息在使用二进制文件安装时一般会自动注册,使用压缩文件不会自己进行注册,但是只要正确配置了环境变量,不会影响使用。环境变量配置好之后可以使用echo %JAVA_HOME%代码来检查变量是否配置正确。安装与卸载中只涉及到三个环境变量,分别为。

weixin_55656641的博客 5242

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Vs2019 打包项目程序和安装卸载程序

Vs2019 打包可以安装的项目程序 条件: (1)安装VS2019和下载拓展插件install projects 新建一个工程 新建工程解决方案–>add–>新建项目–>新建setup Project工程 进入Setup Project界面 右键Application Foluder–>Add->文件 打开项目工程所在的目录 选择全部目录文件,打开 项目输出,右键Application Foluder–>Add->项目输出 点击确定 右键这个输出–

weixin_43108793的博客 6684

Multisim安装与卸载

因为模拟电路需要安装了multism12,卸载的时候却发现不管是360卫士还是腾讯的电脑管家,软件管理里面都找不到multism,再打开控制面板里的“程序和功能”发现还是没有multism,这就很尴尬了,常用的卸载软件的途径里都没有它,那就还剩下一一个地方,就是在安装程序里。

Sophia_fez的博客 4万+

SolidWorks软件的安装与卸载

介绍SolidWorks软件的安装和卸载,仅作分享与学习

2402_83272216的博客 5156

git的卸载与安装

1.找到程序,卸载程序2.找到Git,右键卸载卸载完成!

m0_62909831的博客 5114

Autodesk 专用安装检查和卸载程序

点击下载后,请保存文件,并解压后,再打开程序 ▼▼▼下载地址▼▼▼ aioc.qbgxl.com 主页地址 aioc.qbgxl.com 下面介绍下这个工具,以及使用方法等。 这个工具主要有两个功能 检查安装过程中失败的问题,并自动解决,这样安装的时候就可以顺利进行了,这也是很多网友会遇到的问题。 我本人有多年的经验,所以很多错误能够解决,之前发过一篇帖子,写了很多这样的解决办法 Autodesk 产品正常安装或卸载方式和无法安装或卸载,安装或卸载不正常,等情况的解决办法|http://bbs.qbgxl.

qbhlm的博客 3万+
上一篇: Delphi编程代码规范
下一篇: 钩子注入程序
普通网友
博客等级 码龄20年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值