制作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自带那个就只能执行程序,比如为了安装服务,就要执行一个命令,如果动作比较复杂,还需要专门写个批处理或者专门的程序。

启动条件

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

(这里是结束)

相关推荐
一禅(OneZen)3 小时前
「Windows/Mac OS」AIGC图片生成视频 ,webui + stable-diffusion环境部署教程
windows·stable diffusion
AirDroid_cn4 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
小龙在山东6 小时前
Python 包管理工具 uv
windows·python·uv
昏睡红猹6 小时前
我在厂里搞wine的日子
windows·wine
love530love9 小时前
Docker 稳定运行与存储优化全攻略(含可视化指南)
运维·人工智能·windows·docker·容器
1024小神14 小时前
tauri项目在windows上的c盘没有权限写入文件
c语言·开发语言·windows
程序视点1 天前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
wuk9981 天前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
lzb_kkk1 天前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
Paper_Love1 天前
x86-64_windows交叉编译arm_linux程序
arm开发·windows