sn4735 发表于 2025-1-18 18:12

处理卸载部分比较费劲

最近几个月在用NSIS做绿色精简版Office 2010的安装包(由于自己技术菜+要求多,是“几个月”而不是“几天”)
xb21cn大佬(该精简版的作者)说可以删除不想要的组件

于是制作安装包时自然想有一个组件选择页面



发现个问题,安装时如果勾选安装了可选组件,卸载时卸载程序不知道当时有没有安装这个可选组件

如果直接简单粗暴地检测有没有这个组件的文件,有就删除,个人觉得不靠谱,毕竟要考虑极端情况,万一用户出于探索,将他个人的文件改成这个组件的其中一个文件的名称,然后放在安装目录下(替换掉原有的文件),岂不是把用户的文件删了?
可以增加MD5校验,但感觉还是有点别扭,万一别的软件也有这个文件,并且“巧合”地把该文件放到Office 2010 精简版安装目录下,我把Office 2010 精简版卸载了,别的软件岂不是没法用了?
目前想法是安装时选择了哪个组件,则将在注册表中做标记。卸载时读取注册表,如果注册表中有这个标记,则表明安装时选择了这个组件,使得卸载程序可以知道安装时有没有选择该组件
另一种办法是将标记记录在安装目录下,但这样被误删的几率更大,毕竟打开我的电脑比打开注册表编辑器的频率更高+找到软件的注册表项比找到软件的安装目录更麻烦。
还有一种办法是重新编译NSIS自己。这软件是开源的,编译时有一个选项,如果打开,软件将附带“记录安装日志”功能,安装时做了什么事情,会记录在日志中。卸载时根据安装日志,“反着来”。所以不再担心安装时如果选择这个组件,卸载时卸载程序不知道怎么办(实际仍然不知道,但懂得删除这个组件的文件)。但对于注册dll这种稍微高级点的小动作,卸载程序是否知道应该怎样反着来?以及,听说安装日志是以文件的形式保存在安装目录下,自己不喜欢在安装目录下保存信息的方案。何况我没开发环境+不会把源代码编译成exe。所以该方案暂时算了
所以目前采用在注册表中做标记的方式
不排除有更好的方案,但我不知道了
事实上,本人讨厌任何需要在外部做标记的方案,包括注册表这种方案。毕竟考虑极端情况,在外部做标记,意味着该标记可能会被删除,以及,我不喜欢把一些信息单独存放在外面,以及由于流氓软件的猖獗,很讨厌“写注册表”、“在C盘写文件”这种动作
NSIS最不友好的就是“卸载程序不知道安装时有没有选择这个组件”(除了这一点感觉其他还行)。如果能把相关的标记写进UnInstall.exe中就好了(不排除真的可以)

15ice 发表于 2025-1-19 17:00

差不多就行了,没人这么无聊把文件改名放程序文件夹,大厂的卸载程序都没你这么严谨。{:5_270:}

sn4735 发表于 2025-1-20 10:04

15ice 发表于 2025-1-19 17:00
差不多就行了,没人这么无聊把文件改名放程序文件夹,大厂的卸载程序都没你这么严谨。 ...

哈哈哈哈 觉得网上制作各种工具的大神很厉害,想学习他们,于是删文件这种力所能及的事情对自己要求高
页: [1]
查看完整版本: 处理卸载部分比较费劲