制作windows安装程序的一些基本知识

好的应用软件需要一个正规的安装程序。

正规安装程序不能胡来,什么是胡来呢?

比如我们以前干过这种事:把别的软件安装好,然后检查文件系统和注册表增加了什么,全部打包到我们的安装程序里面,这为什么是胡来呢?我们这么搞,假设用户的电脑上肯定有C盘,windows是默认安装,但是实际的用户未必如此。

有段时间电脑病毒多,有些人主张把操作系统安装在D盘,因为很多病毒只攻击C盘。这种想法其实是因为病毒和我们干了一样的事情:假定用户的安装是标准的。

其实呢,操作系统安装在哪个盘是安装时选择的,操作系统里面的一些特定目录是可以定制的,也会随着操作系统版本不同而改变,所以这些信息都是有API函数专门来提供的,并不是看看自己电脑上的目录结构就可以解决的。

制作安装程序可以不使用辅助软件,直接使用相关函数来进行,但是这样很麻烦,所以有很多安装程序制作工具:

InstallShield 最老牌,最先进,最豪华,最昂贵。

Advanced Installer 也不错,收费的。

还有很多。

VS以前也自带一个,现在是插件,需要独立安装:Microsoft Visual Studio Installer Projects,功能比较简陋,但是看着很专业(朴素)。

还有个更简单的:Winrar自解压,虽然只能处理文件系统,但确实很多软件就用这个来安装,也符合绿色软件理念。

下面介绍一下安装程序相关的概念,每个软件都会涉及(但自动化程度不同),由于安装程序制作比较偏门,这些概念与通常的理解不同,有不少容易误解之处。

安装项目内容

要安装的东西,比如项目输出、文件、动态库、程序集等等,就是要把这些东西安装到用户的系统里面去。

"项目输出"就是安装程序制作工具会识别软件开发项目(比如VS的一个C++的exe程序项目)的输出,根据release还是debug的不同去取相应的输出文件。

"文件"就是一个指定的文件。你当然也可以不用"项目输出"而直接使用"文件",但是这样就只能用固定一种配置,或者你强行指定所有配置都输出到同样的目录和文件。

VS的安装程序制作工具能识别VS的所有项目类型,一个安装项目可以引用多个其他项目的输出,只要在同一个解决方案下即可。

这些文件都是"你自己"的电脑上的东西,要通过安装程序才能出现在用户的系统上。

文件系统

就是用户的文件系统。

目标目录一般默认有三个目标:程序目录、桌面、开始菜单。这个三个目录我们都很熟悉,比如程序目录就是"C:\Program Files"------丢人了啊!前面一开始就说了这样搞是胡来,程序目录是通过api函数查询获取的,用SHGetFolderPath传不同参数去获取不同的特定目录的位置,安装程序制作工具会替我们写这些代码,我们只要在安装工程里正确安排文件就可以了。

安装的文件通常会创建名为"公司名/软件名"的子目录。

开始菜单目录下面一般只放快捷方式,安装程序制作工具会让你选择一个文件作为快捷方式的目标,也就是生成一个指向安装好的文件的快捷方式(所以必须是"文件系统"里面已经安排的文件,而不是"你自己"的电脑上的文件)。

依赖项

就是用到的别的组件和软件,正确做法是执行组件和软件的安装程序,而不是拷贝安装后的文件和注册表。VS的C++程序可能会依赖VS的可再发行包,只调用windows API的程序则没有任何依赖项。把别人的dll直接拷过来放在一起确实可以使用,但是不是专业做法。dll是可以共享的,正确安装的dll在注册表有注册项,相同的文件不会重复安装。

文件类型

注册文件扩展名,这是通过注册表进行的。所有的注册表操作都可以通过直接导入注册表文件来进行,但是如果有正规的api方式,还是用api比较好。使用安装程序制作工具的时候就应该使用工具提供的功能。工具会选择正确的方法。

注册表

这就是直接往注册表写东西了。一般就是写程序自己的东西,别的东西有标准方法的尽量用标准方法,不好直接写注册表。

用户界面

这是安装程序自己的界面,每个界面会有一点点可供定制的东西,主要是文字和图片。豪华安装程序制作工具会提供更多功能。

自定义操作

这是安装过程每一步可以自己定制的操作,可能是通过脚本,也可能只能执行程序,取决于安装程序制作工具的豪华程度。VS自带那个就只能执行程序,比如为了安装服务,就要执行一个命令,如果动作比较复杂,还需要专门写个批处理或者专门的程序。

启动条件

安装之间检查系统,符合条件才能继续安装。

(这里是结束)

相关推荐
天幕繁星14 小时前
docker desktop es windows解决vm.max_map_count [65530] is too low 问题
windows·elasticsearch·docker·docker desktop
百锦再15 小时前
详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
windows·c#·计算机外设
IT-民工2111017 小时前
Ansible剧本检测Windows防火墙状态
linux·运维·windows·自动化·ansible
菜鸟江多多20 小时前
【windows 下使用 tree】
windows
星晨羽20 小时前
esayExcel根据模板导出包含图片
java·开发语言·windows
开发者每周简报1 天前
当微软windows的记事本被AI加持
人工智能·windows·microsoft
命里有定数1 天前
windows工具 -- 使用rustdesk和云服务器自建远程桌面服务, 手机, PC, Mac, Linux远程桌面 (简洁明了)
linux·运维·服务器·windows·ubuntu·远程工作
染指11101 天前
45.第二阶段x86游戏实战2-hook监控实时抓取游戏lua
汇编·c++·windows·反游戏外挂·游戏逆向
我是苏苏2 天前
Web开发:ABP框架6——appsetting.json的读取以及实例的注入
前端·windows·json
TPCloud2 天前
windows 11编译安装ffmpeg(包含ffplay)
windows·ffmpeg·源码安装·mysys