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

启动条件

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

(这里是结束)

相关推荐
forestsea1 小时前
如何使用 Winget 下载 Claude Code 并实现绿色便携安装
windows·claudecode
海天鹰1 天前
WIN10修改窗口标题栏失去焦点背景色
windows
llilay1 天前
企业级FastAPI后端模板搭建(六)加密用户密码
windows·fastapi
梦帮科技1 天前
GRAVIS v5.5:向硬核桌面端进化与云端多节点容灾部署实践
windows·架构·rust·自动化·区块链·智能合约·数字货币
tianyazhichiC1 天前
【VLC player 下载地址】
windows
小呀小叮当~1 天前
OpenAI Codex 桌面版(Windows / macOS)体验分享:AI 编程效率再次提升
人工智能·windows·macos
Starry-sky(jing)1 天前
Win11 装 ESP32 Arduino 库卡 3 小时?我把官方 3.3.10 全平台 522MB 搬到了蓝奏云,解压即用
运维·windows·esp32·arduino·离线安装
程序员老油条2 天前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
binbin_522 天前
Flutter 开发鸿蒙实战:Windows 环境下从 HAP 构建到四 Tab 页面运行
windows·flutter·harmonyos
ylscode2 天前
微软推送KB5095189:Windows 11 OOBE开箱即用体验迎来新一轮优化
windows·microsoft