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

启动条件

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

(这里是结束)

相关推荐
yufei-coder6 小时前
掌握 C# 中的 LINQ(语言集成查询)
windows·vscode·c#·visual studio
立秋678910 小时前
Python的defaultdict详解
服务器·windows·python
Indigo_code10 小时前
【数据结构】【链表代码】合并有序链表
数据结构·windows·链表
暮雪倾风10 小时前
【WPF开发】超级详细的“文件选择”(附带示例工程)
windows·wpf
何中应12 小时前
如何使用CMD命令启动应用程序(二)
windows·桌面应用·batch命令
sukalot14 小时前
windows C++-使用任务和 XML HTTP 请求进行连接(一)
c++·windows
ぃ扶摇ぅ14 小时前
Windows系统编程(三)进程与线程二
c++·windows
weixin_4193497915 小时前
windows上安装python环境
windows
天上掉下来个程小白16 小时前
Stream流的中间方法
java·开发语言·windows
暮雪倾风16 小时前
【WPF开发】控件介绍-Grid(网格布局)
windows·wpf